多文件上傳的核心在於 HTML 表單的 name 屬性使用數組語法 name="myfile[]",PHP 端通過 $_FILES 三維數組接收。
<form action="mul_upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
選擇文件1:<input type="file" name="myfile[]"><br>
選擇文件2:<input type="file" name="myfile[]"><br>
選擇文件3:<input type="file" name="myfile[]"><br>
<input type="submit" value="上傳文件">
</form>
關鍵點:
enctype="multipart/form-data" 必須設置。name="myfile[]" 方括號讓瀏覽器將同名文件組成數組提交。MAX_FILE_SIZE 隱藏字段限制客戶端文件大小(單位字節,僅作提示,服務端必須再驗證)。提交三個文件後,print_r($_FILES) 輸出結構如下:
Array
(
[myfile] => Array
(
[name] => Array
(
[0] => Rav.ini
[1] => msgsocm.log
[2] => NOTEPAD.EXE
)
[type] => Array
(
[0] => application/octet-stream
[1] => application/octet-stream
[2] => application/octet-stream
)
[tmp_name] => Array
(
[0] => C:\WINDOWS\Temp\phpAF.tmp
[1] => C:\WINDOWS\Temp\phpB0.tmp
[2] => C:\WINDOWS\Temp\phpB1.tmp
)
[error] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[size] => Array
(
[0] => 64
[1] => 1350
[2] => 66560
)
)
)
對比單文件上傳(二維數組),多文件上傳在 $_FILES['myfile'] 下每個屬性(name, type, tmp_name, error, size)都變成了索引數組,索引對應文件順序。
<?php
$uploadDir = 'uploads/';
if (!is_dir($uploadDir)) mkdir($uploadDir, 0755, true);
$files = $_FILES['myfile'];
$count = count($files['name']);
for ($i = 0; $i < $count; $i++) {
// 檢查錯誤碼
if ($files['error'][$i] !== UPLOAD_ERR_OK) {
echo "文件 {$files['name'][$i]} 上傳失敗,錯誤碼: {$files['error'][$i]}<br>";
continue;
}
// 安全:驗證文件類型、大小等(此處略)
$src = $files['tmp_name'][$i];
$dest = $uploadDir . basename($files['name'][$i]);
if (move_uploaded_file($src, $dest)) {
echo "文件 {$files['name'][$i]} 上傳成功<br>";
} else {
echo "文件 {$files['name'][$i]} 移動失敗<br>";
}
}
?>
<input type="file" name="myfile[]" multiple>
配合 multiple 屬性,用戶可在一個文件選擇框中按住 Ctrl/Shift 選擇多個文件,後端處理邏輯完全相同。
name="xxx[]" + enctype="multipart/form-data"。$_FILES 變為三維數組,用 for 迴圈遍歷索引處理。error 碼,驗證類型大小,防止惡意上傳。