必须同步调大nginx的client_max_body_size、php的upload_max_filesize与post_max_size,并重启服务;thinkphp自身配置仅为二次校验,无法突破底层限制。

要让 ThinkPHP 支持大文件上传,不能只改框架配置,必须打通“前端 → Web 服务器 → PHP 解析层 → 框架校验”整条链路。核心是:底层限制不放开,框架再怎么配都没用。
Web 服务器必须先放行请求体
Nginx 和 Apache 在 PHP 执行前就可能直接拦截大文件请求:
- Nginx 默认
client_max_body_size是 1MB,超限返回 413 错误,PHP 根本收不到请求。需在对应站点的server块中显式设置,例如:client_max_body_size 128m; - Apache 要检查
LimitRequestBody,尤其注意虚拟主机配置和项目根目录下的.htaccess。若存在且值过小(如1048576),应改为26214400(25MB)或注释掉 - 使用反向代理(如 ALB、Nginx 作网关)时,上游网关也需同步调大 body 限制
PHP 层两个关键参数必须同步调大
这两个值必须同时修改,且 post_max_size ≥ upload_max_filesize:
-
upload_max_filesize = 64M(单文件上限) -
post_max_size = 128M(整个 POST 请求体,含多文件 + 表单字段) - 改完后必须 重启 PHP-FPM 或 Apache/Nginx 服务,仅 reload 不生效
- 用
phpinfo()页面确认实际生效值,别只看配置文件是否写对
ThinkPHP 自身配置只是二次校验,不是突破限制
框架里的 maxSize、validate(['size' => ...]) 等,只在 PHP 成功接收并解析 $_FILES 后才执行:
- 它拦不住
Post size exceeded或 Nginx 的 413,更无法绕过底层拦截 - 适合做业务级约束,比如“单个图片 ≤ 5MB”、“只允许 PDF 和 DOCX”
- 若需上传超 100MB 文件,建议搭配分片上传(前端切片 + 后端合并),此时还需延长超时设置:
max_execution_time、fastcgi_read_timeout、request_terminate_timeout
批量与分片上传的实用建议
直接传超大单文件风险高,推荐结构化处理:
- 批量上传:前端用
<input type="file" name="files[]" multiple>,TP6.0.13+ 可直接$request->file('files')获取数组,每个文件须单独validate()再move() - 分片上传:前端按固定大小(如 5MB/片)切片,携带
chunk、chunks、md5参数;后端保存分片文件,收到最后一片时合并并清理临时分片 - 为避免并发冲突,建议按日期+uniqid生成唯一子目录,如
uploads/20261015/5f8a2b1c/
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











