表單需設置 enctype="multipart/form-data",上傳後 $_FILES['myfile'] 包含:
| 鍵名 | 含義 |
|---|---|
name | 客戶端原始文件名 |
type | MIME 類型(客戶端提供,不可信) |
size | 文件大小(字節) |
tmp_name | 服務端臨時存儲路徑(請求結束自動刪除) |
error | 錯誤代碼(0 表示成功) |
if ($_FILES['myfile']['error'] === UPLOAD_ERR_OK) {
$dest = 'uploads/' . basename($_FILES['myfile']['name']);
if (move_uploaded_file($_FILES['myfile']['tmp_name'], $dest)) {
echo '上傳成功';
} else {
echo '移動文件失敗';
}
} elseif ($_FILES['myfile']['error'] === UPLOAD_ERR_NO_FILE) {
echo '請選擇文件';
} else {
echo '上傳錯誤碼:' . $_FILES['myfile']['error'];
}
finfo_file 檢測真實類型,勿信任 $_FILES['type']。upload_max_filesize、post_max_size + 代碼雙重校驗。uniqid() 或哈希值作為文件名,防止覆蓋、路徑遍歷。大文件上傳建議前端分片(如 WebUploader、Plupload),後端合併分片,配合 session 或數據庫記錄上傳狀態。
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 被擴展阻止