# PHP中$_FILES怎么使用
## 一、$_FILES概述
在PHP中,`$_FILES`是一個超全局數組,專門用于處理通過HTTP POST方法上傳的文件。當HTML表單設置`enctype="multipart/form-data"`屬性時,上傳的文件信息會自動存儲在這個數組中。
### 基本特點:
- 二維關聯數組結構
- 每個上傳文件包含5個關鍵信息
- 僅在文件上傳請求中有效
## 二、$_FILES數組結構
一個典型的上傳文件在`$_FILES`中表現為:
```php
$_FILES = [
'file_field' => [
'name' => 'example.jpg', // 原始文件名
'type' => 'image/jpeg', // MIME類型
'tmp_name' => '/tmp/php3hU2tW', // 服務器臨時路徑
'error' => 0, // 錯誤代碼
'size' => 10240 // 文件大小(字節)
]
];
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="userfile">
<input type="submit" value="上傳">
</form>
<?php
// 檢查文件是否上傳成功
if ($_FILES['userfile']['error'] !== UPLOAD_ERR_OK) {
die("上傳失敗: " . $_FILES['userfile']['error']);
}
// 安全驗證
$allowed_types = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['userfile']['type'], $allowed_types)) {
die("只允許上傳JPEG/PNG圖片");
}
// 限制文件大?。?MB以內)
$max_size = 2 * 1024 * 1024;
if ($_FILES['userfile']['size'] > $max_size) {
die("文件大小超過2MB限制");
}
// 生成唯一文件名
$ext = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);
$new_filename = uniqid() . '.' . $ext;
$upload_path = 'uploads/' . $new_filename;
// 移動臨時文件到永久目錄
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_path)) {
echo "文件上傳成功!保存為: " . htmlspecialchars($new_filename);
} else {
echo "文件保存失敗";
}
?>
$_FILES['field']['error']
可能的值:
常量 | 值 | 說明 |
---|---|---|
UPLOAD_ERR_OK | 0 | 上傳成功 |
UPLOAD_ERR_INI_SIZE | 1 | 超過php.ini的upload_max_filesize限制 |
UPLOAD_ERR_FORM_SIZE | 2 | 超過表單MAX_FILE_SIZE限制 |
UPLOAD_ERR_PARTIAL | 3 | 只有部分文件被上傳 |
UPLOAD_ERR_NO_FILE | 4 | 沒有文件被上傳 |
UPLOAD_ERR_NO_TMP_DIR | 6 | 找不到臨時文件夾 |
UPLOAD_ERR_CANT_WRITE | 7 | 寫入磁盤失敗 |
UPLOAD_ERR_EXTENSION | 8 | PHP擴展阻止了上傳 |
永遠不要信任客戶端數據:
is_uploaded_file()
和move_uploaded_file()
$_FILES['type']
)文件類型驗證建議:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
文件重命名策略:
目錄安全:
.htaccess
限制訪問:
php_flag engine off
deny from all
HTML表單:
<input type="file" name="files[]" multiple>
PHP處理:
foreach ($_FILES['files']['tmp_name'] as $key => $tmp_name) {
// 處理每個文件
$name = $_FILES['files']['name'][$key];
// ...其他處理邏輯
}
修改php.ini配置:
upload_max_filesize = 50M
post_max_size = 55M
max_execution_time = 300
使用session.upload_progress
:
ini_set('session.upload_progress.enabled', true);
ini_set('session.upload_progress.name', 'upload_progress');
文件上傳大小限制:
upload_max_filesize
和post_max_size
post_max_size
> upload_max_filesize
臨時目錄不可寫:
sys_get_temp_dir()
返回值upload_tmp_dir
有寫權限中文文件名亂碼:
$filename = mb_convert_encoding($_FILES['file']['name'], 'UTF-8', 'auto');
$_FILES
是PHP文件上傳的核心機制,正確使用需要注意:
- 嚴格的安全驗證流程
- 完善的錯誤處理
- 合理的服務器配置
- 規范的文件命名和存儲策略
通過本文介紹的方法,您可以構建安全可靠的文件上傳功能,滿足各種Web應用場景的需求。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。