上传失败主因是php与web服务器限制:upload_max_filesize、post_max_size、client_max_body_size(nginx)或limitrequestbody(apache)任一未调大,文件即被拦截;thinkphp仅处理已进入$_files的文件,需同步调整并重启服务验证。

上传失败不是 ThinkPHP 框架的问题,而是 PHP 和 Web 服务器在请求到达框架前就拦截了——upload_max_filesize、post_max_size、client_max_body_size(Nginx)或 LimitRequestBody(Apache)这四个值只要有一个没调大,文件就传不进来。
PHP.ini 里必须同步改的三个参数
ThinkPHP 只能处理已成功进入 $_FILES 的文件;如果 PHP 连解析都没开始,框架压根不会执行任何验证逻辑。
-
upload_max_filesize = 20M:单个文件上限,按业务设,别盲目写100M -
post_max_size = 25M:整个 POST 请求体上限,必须 ≥upload_max_filesize,建议多留 5M 给其他表单字段 -
memory_limit = 256M:至少是post_max_size的 1.5 倍,否则 PHP 解析大 POST 时直接内存溢出
改完必须重启 PHP-FPM(如 systemctl restart php8.1-fpm)或 Apache/Nginx,仅 reload 不生效。用 phpinfo() 页面确认 “Loaded Configuration File” 路径,并核对这三个值是否已更新。
Nginx 下 client_max_body_size 必须显式配置
哪怕 PHP 配置全放开,Nginx 默认只允许 1MB 的请求体,超了直接返回 413 Request Entity Too Large,且不会进 PHP 日志——你看到这个错误但 error_log 空空如也,基本就是它。
- 在 ThinkPHP 对应的
server或location块里加:client_max_body_size 25M; - 不要写在
http全局块——可能影响其他站点 - 若用了反向代理或负载均衡(如 ALB、SLB),检查上游网关是否也有 body size 限制
改完执行 nginx -t && nginx -s reload,语法错误会导致 reload 失败但不报错,务必先 -t 测试。
ThinkPHP 的 fileSize 验证规则只校验字节,不拦截上传
TP6 的 fileSize 规则只在文件已成功上传并生成临时文件后才起作用,它对 POST Content-Length exceeds the limit 或 413 错误完全无感。
- 必须传整数字节值,例如
2097152(2MB),不能写'2M'或'2048K'——字符串会被当 0 处理 - 规则要写在
validate()方法参数中,且必须调用$file->validate($rule)才生效 - 该规则对空文件(
size=0)默认通过,如需禁止,额外加require
它只是应用层最后一道防线,不能替代服务器级限制;上传大文件时若只靠它,用户点提交后页面卡住或直接白屏,根本看不到提示。
Apache 用户容易漏掉 LimitRequestBody
这个指令和 Nginx 的 client_max_body_size 功能一致,但默认不限制;一旦你在 .htaccess 或虚拟主机配置里设过,就可能意外挡住上传。
- 检查项目根目录下的
.htaccess和 Apache 虚拟主机配置,搜索LimitRequestBody - 如果存在且值太小(如
LimitRequestBody 1048576),改为LimitRequestBody 26214400(25M)或直接注释掉 - 改完执行
apachectl configtest && systemctl reload apache2
超时设置也得同步调大:大文件上传慢,max_execution_time 和 max_input_time 设为 300(5 分钟)更稳妥,否则脚本会在上传中途被 kill。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











