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

PHP $_FILES 陣列完整指南:上傳檔案處理與常見錯誤碼詳解

     編輯:PHP 相關知識

    理解 $_FILES 超全域陣列結構

    在 PHP 中處理檔案上傳時,$_FILES 是核心超全域變數,它包含了所有上傳檔案的詳細資訊。假設表單中檔案輸入欄位的 name 為 myFile,則可以透過 $_FILES['myFile'] 存取以下鍵值:

    • name:客戶端原始檔案名稱(例如 photo.jpg)。
    • type:瀏覽器提供的 MIME 類型(如 image/jpeg),但此值不可完全信任,建議伺服器端再次驗證。
    • size:檔案大小,單位為位元組(bytes)。
    • tmp_name:檔案上傳後在伺服器暫存目錄中的臨時檔名(預設由系統指定,可透過 php.ini 的 upload_tmp_dir 設定;注意 putenv() 無法修改此路徑)。
    • error:上傳過程的錯誤代碼(PHP 4.2.0 起引入),成功上傳時值為 0。

    常見上傳錯誤代碼對照表

    以下常數自 PHP 3.0 起可用,對應 $_FILES['myFile']['error'] 的值:

    常數值說明
    UPLOAD_ERR_OK0無錯誤,檔案上傳成功。
    UPLOAD_ERR_INI_SIZE1上傳檔案超過 php.ini 中 upload_max_filesize 限制。
    UPLOAD_ERR_FORM_SIZE2檔案大小超過 HTML 表單 MAX_FILE_SIZE 隱藏欄位指定的值。
    UPLOAD_ERR_PARTIAL3檔案僅部分上傳(網路中斷等)。
    UPLOAD_ERR_NO_FILE4沒有檔案被上傳(使用者未選擇檔案)。
    UPLOAD_ERR_NO_TMP_DIR6找不到臨時資料夾(PHP 5.0.3 起引入)。
    UPLOAD_ERR_CANT_WRITE7寫入磁碟失敗(PHP 5.1.0 起引入)。
    UPLOAD_ERR_EXTENSION8PHP 擴展阻止檔案上傳(PHP 5.2.0 起引入)。

    關鍵注意事項與最佳實踐

    1. 臨時檔案會自動清除:腳本執行結束後,暫存目錄中的上傳檔案會被自動刪除。因此必須在腳本結束前,使用 move_uploaded_file()(推薦)或 copy() 將檔案移動/複製到永久儲存位置,否則檔案將遺失。
    2. 舊版本相容性:PHP 4.1.0 之前使用 $HTTP_POST_FILES,且非自動全域變數;PHP 3 不支援該陣列。現代代碼應直接使用 $_FILES。
    3. 表單必須設定 enctype:上傳檔案的 <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>
    4. 安全驗證:切勿直接信任 ['type'] 或 ['name']。應使用 finfo_file() 或 mime_content_type() 檢測真實 MIME 類型,並對檔案副檔名、內容進行白名單驗證,防止惡意腳本上傳。
    5. 大小限制雙重設定:除了 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 '移動檔案失敗,請檢查權限。';
        }
    }
    ?>
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved