在 PHP 中處理檔案上傳時,$_FILES 是核心超全域變數,它包含了所有上傳檔案的詳細資訊。假設表單中檔案輸入欄位的 name 為 myFile,則可以透過 $_FILES['myFile'] 存取以下鍵值:
photo.jpg)。image/jpeg),但此值不可完全信任,建議伺服器端再次驗證。php.ini 的 upload_tmp_dir 設定;注意 putenv() 無法修改此路徑)。以下常數自 PHP 3.0 起可用,對應 $_FILES['myFile']['error'] 的值:
| 常數 | 值 | 說明 |
|---|---|---|
| UPLOAD_ERR_OK | 0 | 無錯誤,檔案上傳成功。 |
| UPLOAD_ERR_INI_SIZE | 1 | 上傳檔案超過 php.ini 中 upload_max_filesize 限制。 |
| UPLOAD_ERR_FORM_SIZE | 2 | 檔案大小超過 HTML 表單 MAX_FILE_SIZE 隱藏欄位指定的值。 |
| UPLOAD_ERR_PARTIAL | 3 | 檔案僅部分上傳(網路中斷等)。 |
| UPLOAD_ERR_NO_FILE | 4 | 沒有檔案被上傳(使用者未選擇檔案)。 |
| UPLOAD_ERR_NO_TMP_DIR | 6 | 找不到臨時資料夾(PHP 5.0.3 起引入)。 |
| UPLOAD_ERR_CANT_WRITE | 7 | 寫入磁碟失敗(PHP 5.1.0 起引入)。 |
| UPLOAD_ERR_EXTENSION | 8 | PHP 擴展阻止檔案上傳(PHP 5.2.0 起引入)。 |
move_uploaded_file()(推薦)或 copy() 將檔案移動/複製到永久儲存位置,否則檔案將遺失。$HTTP_POST_FILES,且非自動全域變數;PHP 3 不支援該陣列。現代代碼應直接使用 $_FILES。<form> 標籤必須包含 enctype="multipart/form-data",否則 $_FILES 將為空或報錯。
<form enctype="multipart/form-data" action="upload.php" method="post">
<input name="myFile" type="file">
<input type="submit" value="上傳檔案">
</form>
['type'] 或 ['name']。應使用 finfo_file() 或 mime_content_type() 檢測真實 MIME 類型,並對檔案副檔名、內容進行白名單驗證,防止惡意腳本上傳。php.ini 的 upload_max_filesize 和 post_max_size,前端表單也可加入 <input type="hidden" name="MAX_FILE_SIZE" value="2000000">(單位 bytes)作為初步攔截,但伺服器端仍需強制檢查。<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['myFile'])) {
$file = $_FILES['myFile'];
if ($file['error'] !== UPLOAD_ERR_OK) {
die('上傳失敗,錯誤代碼:' . $file['error']);
}
// 驗證檔案類型、大小等...
$dest = '/var/www/uploads/' . basename($file['name']);
if (move_uploaded_file($file['tmp_name'], $dest)) {
echo '檔案上傳成功:' . $dest;
} else {
echo '移動檔案失敗,請檢查權限。';
}
}
?>