必须确保 post_max_size ≥ upload_max_filesize 且 Nginx client_max_body_size 同步调大,PHP memory_limit ≥ post_max_size,并显式调用 $file->validate(),否则上传必然失败。

upload_max_filesize 和 post_max_size 不匹配就必然失败
ThinkPHP 6.0 本身不拦截超大文件,它只在 PHP 成功接收到文件后才做校验;真正卡住上传的第一道关卡是 PHP 解析器。如果 upload_max_filesize = 50M,但 post_max_size = 40M,哪怕你传一个 45MB 的文件,PHP 就会直接拒绝整个 POST 请求,返回 “PHP Warning: POST Content-Length … exceeds limit” 错误,TP6 根本收不到文件对象。
必须保证:post_max_size ≥ upload_max_filesize,且建议多留 5–10MB 余量(比如前者设 60M,后者设 50M),因为 POST 数据里还包含表单字段、边界符等额外开销。
- 修改后必须重启 PHP-FPM 或 Apache,仅重载 Nginx 不生效
- 用
phpinfo()页面确认 “Loaded Configuration File” 路径,并核对这两项值是否已更新 -
max_file_uploads默认是 20,如果一次提交 30 个文件,也会被 PHP 拒绝,需同步调高
Nginx 的 client_max_body_size 是前置拦截器
即使 PHP 和 TP6 都放行了,Nginx 会在请求抵达 PHP 前就把它干掉——默认只允许 1MB 请求体。此时浏览器看到的是 HTTP 413 错误,PHP 错误日志里完全没记录,非常迷惑。
这个配置不能写在全局 http{} 块里,否则会影响所有站点;必须精确加到你的站点 server{} 或对应 location{} 块内:
立即学习“PHP免费学习笔记(深入)”;
client_max_body_size 60M;
注意分号不能漏,且单位大小写敏感(60m 无效,必须是 60M)。
- 改完要执行
nginx -t验证语法,再nginx -s reload - 若用 FastCGI,还需检查
fastcgi_buffer_size和fastcgi_buffers,否则大文件可能触发 “upstream sent too big header” - Apache 用户对应的是
LimitRequestBody 62914560(字节),不是 MB 单位
TP6 的 validate() 不是可选动作
很多人以为只要底层放开,TP6 就自动放行——错。框架层的校验是显式触发的,不调 $file->validate(),它就根本不检查 size、ext 等规则,哪怕你写了也不生效。
典型写法:
$file = $this->request->file('avatar');<br>if (!$file->validate(['size' => 52428800, 'ext' => 'jpg,png'])) {<br> $this->error($file->getError());<br>}
注意:size 单位是字节,不是 MB;ext 列表必须全小写、不含点;验证失败时 getError() 才返回具体原因。
- 如果用
think\Filesystem驱动上传,config/filesystem.php里的max_size是针对磁盘驱动的,和上传校验无关 - 全局 upload 配置(如
config/upload.php)只是业务封装,最终仍要落到validate()调用上 - 别依赖
$_FILES['xxx']['size']做判断——PHP 在超限后会把这个值设为 0,不可靠
memory_limit 不够会导致静默失败
上传 50MB 文件时,PHP 默认 memory_limit = 128M 可能不够:文件读入内存、图像缩略图生成、临时文件复制都会吃内存。一旦超限,脚本直接终止,无明确错误,只留下空白响应或 500。
建议设为 memory_limit = 256M 或更高,且必须 ≥ post_max_size(比如后者是 60M,前者至少 128M)。
- 这个值在 php.ini 中修改最稳妥;
.htaccess或ini_set()往往被禁用,尤其在 FPM 模式下无效 - 如果用 GD 处理图片,还要留意
gd.jpeg_ignore_warning等扩展级限制 - 上传过程中的超时问题,除了
max_execution_time,更要关注max_input_time(处理输入数据的时间上限)



















