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

PHP 文件上傳全攻略(上):核心原理、$_FILES 詳解與服務端配置

     編輯:PHP 相關知識

PHP 文件上傳全攻略(上):核心原理、$_FILES 詳解與服務端配置

文件上傳是 Web 應用的基礎功能,但涉及客戶端限制、服務端配置、安全校驗、存儲策略等多個環節。本系列分上中下三篇,系統講解從原理到生產級封裝的完整知識體系。上篇聚焦核心流程、$_FILES 結構、php.ini 關鍵配置與客戶端偽安全性。

一、上傳核心流程

  1. 用戶通過 <input type="file"> 選擇文件提交表單(enctype="multipart/form-data");
  2. Web Server(Nginx/Apache)接收請求體,將文件寫入**臨時目錄**(如 /tmp/phpXXXXXX);
  3. PHP 腳本啟動,$_FILES 超全局變量填充臨時文件信息;
  4. 腳本驗證合法性(類型、大小、真實性、上傳方式);
  5. 調用 move_uploaded_file() 或 copy() 將臨時文件移動到**持久化存儲目錄**;
  6. 記錄文件元數據入庫,返回前端可訪問 URL。

二、$_FILES 結構深度解析

單文件上傳時 $_FILES['fieldName'] 為一維關聯數組:

鍵名含義示例
name客戶端原始文件名avatar.png
type瀏覽器報告的 MIME 類型(不可信)image/png
tmp_name服務端臨時文件絕對路徑(核心)/tmp/phpA1b2C3
size文件大小(字節)102400
error錯誤碼(0 成功,非 0 見下表)0

error 錯誤碼對照表

常量值含義
UPLOAD_ERR_OK0上傳成功
UPLOAD_ERR_INI_SIZE1超過 php.ini upload_max_filesize
UPLOAD_ERR_FORM_SIZE2超過表單 MAX_FILE_SIZE
UPLOAD_ERR_PARTIAL3僅部分上傳
UPLOAD_ERR_NO_FILE4未選擇文件
UPLOAD_ERR_NO_TMP_DIR6缺少臨時目錄
UPLOAD_ERR_CANT_WRITE7寫入磁盤失敗
UPLOAD_ERR_EXTENSION8PHP 擴展阻止上傳

三、php.ini 關鍵配置指南

指令默認值建議生產值說明
file_uploadsOnOn總開關
upload_tmp_dir系統臨時目錄/var/www/tmp_upload專用臨時目錄,需 PHP 進程用戶可寫
upload_max_filesize2M20M單文件上限,配合 Nginx client_max_body_size
max_file_uploads2050單請求最大文件數
post_max_size8M25MPOST 總體上限,**必須 > upload_max_filesize**
max_execution_time30300大文件上傳需更長執行時間
max_input_time60300解析輸入數據時間
memory_limit128M256M單腳本內存上限

四、客戶端「偽安全」限制(不可信)

屬性/手段代碼局限性
MAX_FILE_SIZE 隱藏域<input type="hidden" name="MAX_FILE_SIZE" value="2097152">瀏覽器**不強制執行**,用戶可篡改/移除
accept 屬性<input type="file" accept="image/*">僅過濾文件選擇對話框,不阻止提交
JS 前端校驗file.size > 2*1024*1024繞過極簡單(禁用 JS、修改請求)

結論:所有安全校驗**必須在服務端**執行,客戶端僅作為體驗優化。

五、表單與 php.ini 限制的優先級關係

  • 若表單 MAX_FILE_SIZE=2M,php.ini upload_max_filesize=10M:
  • 上傳 5M 文件 → PHP 層面通過,但腳本檢測到 $_FILES['error']==2(表單限制),返回「超過表單限制」;
  • 上傳 15M 文件 → PHP 核心層直接拒絕,$_FILES['error']==1(ini 限制),腳本可能未執行即報錯。

下篇將實戰封裝生產級上傳類,涵蓋類型白名單、魔數檢測、唯一命名、目錄自動創建、錯誤碼多語言映射等核心功能。

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