文件上傳受限於 PHP 設定、Nginx 設定、瀏覽器/客戶端 三層。只要其中一層設定過小,大檔上傳就會失敗(常見 413 Request Entity Too Large 或靜默截斷)。
; 1. POST 資料總大小上限(必須 ≥ upload_max_filesize) post_max_size = 100M ; 2. 單一文件上傳上限 upload_max_filesize = 100M ; 3. 腳本最大執行時間(大檔上傳需較久,建議 300 秒以上) max_execution_time = 300 ; 4. 記憶體限制(處理大檔案時可能需調大) memory_limit = 256M ; 5. 輸入時間限制(含上傳時間) max_input_time = 300
關鍵關係:post_max_size ≥ upload_max_filesize。若 POST 包含多個檔案或其他表單欄位,post_max_size 需大於所有檔案總和。
# nginx.conf 或 site-enabled/your-site.conf
http {
# 客戶端請求主體最大值(預設 1m)
client_max_body_size 100m;
# 緩衝區設定(大檔上傳建議調大)
client_body_buffer_size 16k;
# 超時設定
client_body_timeout 60s;
}
修改後執行平滑重載:
nginx -t && nginx -s reload
<?php
echo 'post_max_size: ' . ini_get('post_max_size') . PHP_EOL;
echo 'upload_max_filesize: ' . ini_get('upload_max_filesize') . PHP_EOL;
echo 'memory_limit: ' . ini_get('memory_limit') . PHP_EOL;
echo 'max_execution_time: ' . ini_get('max_execution_time') . PHP_EOL;
?>
Content-Range、Resumable.js、Uppy 等庫session.upload_progress (PHP 5.4+) 或 XMLHttpRequest Level 2 upload.onprogress| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| 413 Request Entity Too Large | Nginx client_max_body_size 過小 | 調大 Nginx 設定並 reload |
| $_FILES 為空、$_POST 為空 | PHP post_max_size 過小 | 調大 php.ini 並重啟 PHP-FPM |
| 上傳大檔案中途斷開 | Nginx/PHP-FPM 超時設定過短 | 調大 client_body_timeout、request_terminate_timeout |
| 上傳成功但檔案損壞 | 磁碟空間不足、upload_tmp_dir 權限問題 | 檢查 df -h、臨時目錄寫入權限 |
依照本指南逐層檢查設定,即可解決 99% 的文件上傳大小限制問題。記得:改完設定必須重啟對應服務才會生效。