thinkphp本身不拦截超限上传,filesize规则仅校验已存临时文件;真正拦截的是php的upload_max_filesize和post_max_size、nginx的client_max_body_size三层限制,任一未调大均导致413错误或白屏,且必须重启服务并显式调用validate()才生效。

ThinkPHP 本身不拦截超限文件上传,fileSize 规则只是“事后校验”,真正拦住大文件的是 PHP 和 Web 服务器——所以你必须配三层限制,否则用户点提交后直接卡死、白屏或返回 413,连错误提示都收不到。
PHP 的 upload_max_filesize 和 post_max_size 是硬门槛
这两个值决定 PHP 是否愿意解析请求体。只要任一不达标,$_FILES 就是空数组,ThinkPHP 根本拿不到文件对象,$request->file() 返回 null,后续所有验证逻辑(包括 fileSize)全部跳过。
-
upload_max_filesize = 50M:单个文件上限,按业务设,别盲目写200M -
post_max_size = 60M:整个 POST 请求体上限,必须 ≥upload_max_filesize+ 其他表单字段体积 -
memory_limit至少是post_max_size的 1.5 倍,否则 PHP 解析阶段就内存溢出报 500 - 改完必须重启
php-fpm(如systemctl restart php8.1-fpm),仅reload不生效
Nginx 的 client_max_body_size 会静默截断请求
哪怕 PHP 配置全放开,Nginx 默认只允许 1MB 请求体。超了直接返回 413 Request Entity Too Large,且不进 PHP 日志——你看到错误但 error_log 空空如也,基本就是它。
- 必须加在
server{}或具体location{}块里,不能写在http{}全局块(影响其他站点) - 值要 ≥ PHP 的
post_max_size,例如client_max_body_size 60M; - 执行
nginx -t验证语法再nginx -s reload,语法错会导致 reload 失败但无提示 - 若用了云负载均衡(如 ALB/SLB),上游网关也可能有 body size 限制,需同步检查
ThinkPHP 的 fileSize 规则只校验临时文件,且单位必须是整数字节
它只在文件已成功上传并存为临时文件后才运行,属于最后一道业务防线。传字符串(如 '2M')会静默当 0 处理,规则失效。
- 正确写法:
['size' => 52428800](即 50MB),或提前算好:50 * 1024 * 1024 - 错误写法:
['size' => '50M']、['size' => '51200K']——框架不解析单位 - 必须显式调用:
$file->validate(['size' => 52428800]),写在配置文件里或只定义不调用都不生效 - 该规则对空文件(
size=0)默认通过,如需禁止,额外加require
最容易被忽略的点:fileSize 报错信息默认是「上传文件大小不符」,用户根本分不清是前端限制、Nginx 拦截,还是框架拒绝。真要上线,得显式覆盖错误消息,并配合前端做 input.files[0].size 检查——但记住,前端校验纯属体验优化,服务端三层限制一个都不能少。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











