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

深入解析 PHP $_FILES 陣列:檔案上傳核心機制與實戰注意事項

     編輯:PHP 綜合知識

前言

在 PHP 開發中,檔案上傳是極為常見的功能。而 $_FILES 超全域陣列則是處理上傳檔案資訊的核心。本文將系統整理 $_FILES 的結構、錯誤代碼常數,並針對臨時檔案處理、表單編碼、版本差異等實戰陷阱進行深度解析,助你避開常見坑點。

一、$_FILES 陣列結構詳細說明

假設表單的檔案輸入欄位名稱為 myFile,上傳後 $_FILES['myFile'] 將包含以下鍵值:

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

二、上傳錯誤代碼常數對照表

以下常數自 PHP 3.0 起可用,建議直接使用常數而非數值,提升可讀性:

常數值說明
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() 將檔案移至永久儲存位置。

// 正確範例
$dest = '/var/www/uploads/' . basename($_FILES['myFile']['name']);
if (move_uploaded_file($_FILES['myFile']['tmp_name'], $dest)) {
    echo '上傳成功';
} else {
    echo '移動失敗';
}

2. 表單必須設定 enctype="multipart/form-data"

這是最常見的新手錯誤。若缺少此屬性,$_FILES 將為空,無法獲取任何檔案資訊。

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="myFile">
    <input type="submit" value="上傳">
</form>

3. 版本差異:$HTTP_POST_FILES vs $_FILES

  • PHP 4.1.0 之前:使用 $HTTP_POST_FILES,**非**自動全域變數,需在函式中宣告 global $HTTP_POST_FILES。
  • PHP 4.1.0 起:引入 $_FILES,為超全域變數,直接可用。
  • PHP 3:不支援 $HTTP_POST_FILES。

現代專案請直接使用 $_FILES,忽略舊版寫法。

四、進階建議:安全性與穩健性

  1. 驗證 MIME 類型:勿信任 $_FILES['type'],改用 finfo_file() 或 mime_content_type() 解析實際內容。
  2. 限制副檔名與檔案大小:在 php.ini 設定 upload_max_filesize、post_max_size,並在程式碼二次驗證。
  3. 防止檔案名衝突:重新命名儲存檔案(如 uniqid() . '_' . 原檔名),避免覆蓋與路徑遍歷攻擊。
  4. 掃描惡意內容:上傳圖片可用 getimagesize() 驗證;其他類型建議整合防毒掃描。

結語

掌握 $_FILES 的結構與錯誤代碼,配合正確的表單編碼與臨時檔案處理流程,即可構建穩健的檔案上傳功能。記住:永遠在伺服端驗證,不要信任客戶端資料。

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