thinkphp6上传大小限制需同步调整nginx、php和框架三层配置:nginx设client_max_body_size,php调upload_max_filesize和post_max_size,框架用字节数写filesize规则。

ThinkPHP6 本身不控制上传上限,真正卡住上传的是 PHP 和 Web 服务器的底层限制。框架层的 fileSize 规则只是最后一道业务校验,必须等文件成功传到 PHP 才会执行。所以“限制上传大小”不是改一个地方就能解决的事,得从下往上同步调三层配置。
PHP 层:必须同时改两个关键参数
PHP 在解析请求前就做硬拦截,靠的是 upload_max_filesize(单文件)和 post_max_size(整个 POST 请求体)。后者必须 ≥ 前者,并预留表单其他字段空间。
- 打开
php.ini,设upload_max_filesize = 20M - 设
post_max_size = 25M(比前者多 5MB 余量) - 可选但推荐:检查
max_file_uploads(默认 20),如需一次传多个文件,可调高 - 改完必须重启 PHP-FPM 或 Apache,仅 reload 不生效
- 用
phpinfo()页面确认数值已更新,别只信配置文件
Nginx 层:client_max_body_size 是第一道关
Nginx 默认只允许 1MB 请求体,超了直接返回 413 Request Entity Too Large,PHP 根本收不到请求。这个限制独立于 PHP,必须显式放开。
- 在 ThinkPHP 对应站点的
server块里加:client_max_body_size 25M; - 不要写在
http全局块,避免影响其他虚拟主机 - 改完执行
nginx -t && nginx -s reload,语法错误会导致重载失败 - 若用了 CDN、反向代理或云 WAF,它们也常自带 body size 限制,需一并检查
ThinkPHP 层:fileSize 规则要写对才生效
该规则只在校验阶段起作用,且只认整数字节值,字符串单位(如 '2M')会静默失效。
- 正确写法:
'fileSize' => 2097152(即 2MB),或用计算式2 * 1024 * 1024 - 错误写法:
'fileSize' => '2M'、'fileSize' => '2048K'——框架不解析单位,当 0 处理 - 规则必须配合
$file->validate($rule)显式调用,否则不会触发 - 空文件(size=0)默认通过,如需禁止,额外加
require - 多个文件字段要分别配规则,不能共用一个
fileSize键
上传失败时怎么快速定位问题
看到“文件没传上来但验证没报错”,大概率是某一层提前熔断了:
- 返回
413错误 → 查 Nginx 的client_max_body_size - 页面空白或
$_FILES为空 → 检查 PHP 的upload_max_filesize和post_max_size - 报
Post size exceeded→post_max_size小于实际请求体积 - 上传中途断开 → 调大 Nginx 的
client_body_timeout和fastcgi_read_timeout - 验证器提示模糊 → 在规则中显式定义错误消息,例如:
'fileSize' => '文件大小不能超过 2MB'
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











