在 Web 開發中,多檔案上傳是常見需求。PHP 處理多檔案上傳的機制與單檔案類似,關鍵在於前端表單的設計與後端 $_FILES 超全域陣列的結構差異。本文將詳細說明如何構建支援多檔案上傳的 HTML 表單,並解析 PHP 端接收資料的三維陣列結構。
要實現多檔案同時上傳,只需在表單中提供多個 type="file" 的輸入欄位,並將其 name 屬性設定為陣列形式(例如 name="myfile[]")。以下是標準範例:
<html>
<head><title>多檔案上傳表單</title></head>
<body>
<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>
</body>
</html>
關鍵說明:
enctype="multipart/form-data":必須設定,否則檔案無法傳輸。MAX_FILE_SIZE:隱藏欄位,限制單一檔案大小(單位為位元組),此處設為 1MB。name='myfile[]':方括號 [] 讓 PHP 自動將上傳檔案整理為陣列。$_FILES 結構分析表單送出後,PHP 透過 $_FILES 超全域變數接收資料。單檔案上傳時為二維陣列,多檔案則變為三維陣列。我們可以用 print_r($_FILES) 觀察結構:
<?php
// 列印 $_FILES 結構以利除錯
print_r($_FILES);
?>
假設上傳三個檔案(Rav.ini、msgsocm.log、NOTEPAD.EXE),輸出結果如下:
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
)
)
)
| 鍵名 | 說明 | 範例值 |
|---|---|---|
name | 原始檔案名稱陣列 | ['Rav.ini', 'msgsocm.log', 'NOTEPAD.EXE'] |
type | MIME 類型陣列 | ['application/octet-stream', ...] |
tmp_name | 伺服器暫存路徑陣列 | ['C:\WINDOWS\Temp\phpAF.tmp', ...] |
error | 錯誤代碼陣列(0 表示成功) | [0, 0, 0] |
size | 檔案大小陣列(位元組) | [64, 1350, 66560] |
取得陣列後,通常搭配 foreach 迴圈逐一處理每個檔案:
<?php
if (isset($_FILES['myfile'])) {
$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;
}
// 移動暫存檔到目標目錄
$dest = "uploads/" . basename($files['name'][$i]);
if (move_uploaded_file($files['tmp_name'][$i], $dest)) {
echo "檔案 {$files['name'][$i]} 上傳成功<br>";
} else {
echo "檔案 {$files['name'][$i]} 移動失敗<br>";
}
}
}
?>
<input type="file" name="myfile[]" multiple>,讓使用者一次選取多個檔案,無需重複輸入框。php.ini 中的 upload_max_filesize、post_max_size、max_file_uploads 等參數。PHP 多檔案上傳的核心在於前端使用陣列命名法 name="files[]",後端接收到的 $_FILES 會自動轉為三維陣列。掌握此結構後,即可靈活實作批次上傳、圖片相簿、文件管理等功能。建議搭配 HTML5 multiple 屬性與完善的伺服器端驗證,打造安全好用的上傳介面。