需同时调整PHP、Web服务器和ThinkPHP三层限制:PHP端修改upload_max_filesize和post_max_size;Nginx端配置client_max_body_size;TP5.1端设置maxSize并确保enctype为multipart/form-data,还需排查超时、缓冲区及云WAF等干扰因素。

TP5.1 中配置了上传文件大小限制,但大文件仍上传失败,通常不是单靠修改框架配置就能解决的,而是多个层级共同作用的结果。关键在于:PHP 本身、Web 服务器(Nginx/Apache)、ThinkPHP 框架三者限制必须全部放开且一致,缺一不可。
检查并调整 PHP 的上传限制
ThinkPHP 的上传配置(如 maxSize)只是应用层校验,真正拦住大文件的是 PHP 的底层设置。需确认并修改以下两项:
-
upload_max_filesize:PHP 允许上传的单个文件最大值(如
100M) -
post_max_size:整个 POST 请求体最大值,必须 ≥
upload_max_filesize(建议设为128M)
修改 php.ini 后务必重启 PHP-FPM 或 Web 服务。可通过 phpinfo() 页面确认生效值。
检查 Web 服务器限制(以 Nginx 为例)
Nginx 默认限制请求体大小为 1MB,即使 PHP 和 TP 都放开,也会在入口就被拒绝。需在对应 server 或 location 块中添加:
client_max_body_size 128M;
注意:该指令不支持放在 if 或 location /upload 内嵌块中(部分旧版本),建议直接写在 server{} 块顶层。改完后执行 nginx -t && nginx -s reload。
ThinkPHP 层面的配置与校验
确保 TP5.1 的上传配置正确启用,并注意单位和逻辑:
- 使用
maxSize时单位是字节(如104857600= 100MB),不是字符串'100M' - 若用
File类手动上传,需显式传入配置:$file->validate(['size'=>104857600, 'ext'=>'jpg,png'])->move($path); - 表单 enctype 必须为
multipart/form-data,否则文件字段根本不会提交
排查常见干扰因素
上传失败却不报明确错误,往往因被中间环节静默拦截:
- 浏览器上传超时(尤其弱网环境):可临时增加
fastcgi_read_timeout 300;(Nginx)或max_execution_time 300;(PHP) - PHP 开启了
output_buffering且缓冲区满,导致上传中断——可尝试关闭或调大 - 云 WAF/CDN(如阿里云 DDoS 防护、腾讯云 CDN)可能自带文件大小限制,需单独检查控制台策略

















