首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 多檔案上傳表單設計完整指南與實作範例

     編輯:PHP 綜合知識

前言

在 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 自動將上傳檔案整理為陣列。

後端 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']
typeMIME 類型陣列['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>";
        }
    }
}
?>

進階技巧與注意事項

  1. HTML5 multiple 屬性:現代瀏覽器支援 <input type="file" name="myfile[]" multiple>,讓使用者一次選取多個檔案,無需重複輸入框。
  2. 安全性驗證:務必驗證檔案類型、大小、副檔名,並重新命名檔案避免覆蓋或執行惡意腳本。
  3. PHP 設定限制:注意 php.ini 中的 upload_max_filesize、post_max_size、max_file_uploads 等參數。
  4. 錯誤代碼對照表:
    • 0 (UPLOAD_ERR_OK):成功
    • 1 (UPLOAD_ERR_INI_SIZE):超過 php.ini upload_max_filesize
    • 2 (UPLOAD_ERR_FORM_SIZE):超過表單 MAX_FILE_SIZE
    • 3 (UPLOAD_ERR_PARTIAL):僅部分上傳
    • 4 (UPLOAD_ERR_NO_FILE):未選擇檔案

總結

PHP 多檔案上傳的核心在於前端使用陣列命名法 name="files[]",後端接收到的 $_FILES 會自動轉為三維陣列。掌握此結構後,即可靈活實作批次上傳、圖片相簿、文件管理等功能。建議搭配 HTML5 multiple 屬性與完善的伺服器端驗證,打造安全好用的上傳介面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved