ThinkPHP 文件上传大小限制需 PHP、Web 服务器和框架三层协同:PHP 层调大 upload_max_filesize 和 post_max_size 并重启服务;Nginx/Apache 配置 client_max_body_size 或 LimitRequestBody;ThinkPHP 层用整数字节显式调用 validate 校验。

ThinkPHP 限制文件上传大小不是单靠框架配置就能搞定的事,它需要 PHP 底层、Web 服务器(Nginx/Apache)和 ThinkPHP 应用层三者协同生效。只改其中一层,上传大概率失败或报错不明确。
PHP 层:必须调大两个核心参数
PHP 在解析请求前就强制校验上传体积,upload_max_filesize 控制单个文件上限,post_max_size 控制整个 POST 请求体(含所有字段 + 所有文件)的总大小。两者必须同时调整,且 post_max_size ≥ upload_max_filesize,否则哪怕只传一个文件也会被拦截。
- 编辑 php.ini,例如设为:
upload_max_filesize = 20Mpost_max_size = 25M(建议多留 5MB 给表单其他字段) - 修改后必须重启 PHP 服务(如
systemctl restart php-fpm),仅 reload 不生效 - 用
phpinfo()页面确认参数已更新,别只看配置文件是否写对
Nginx 或 Apache:第一道硬性拦截
Web 服务器在请求到达 PHP 前就可能拦掉超限请求,此时 PHP 日志为空、$_FILES 为空、浏览器直接返回 413 Request Entity Too Large。
-
Nginx:在对应站点的
server块中添加client_max_body_size 25M;(值需 ≥ PHP 的post_max_size) -
Apache:在虚拟主机配置或
.htaccess中添加LimitRequestBody 26214400(单位是字节,25MB = 26214400) - 改完务必验证并重载:
Nginx 执行nginx -t && nginx -s reload
Apache 执行apachectl configtest && systemctl reload apache2
ThinkPHP 层:应用级校验,必须显式调用
框架层的限制只是“最后一道防线”,只在校验上传成功后的临时文件时起作用。它不拦截上传过程本身,但能提供业务级控制(比如某字段只允许 ≤2MB)和清晰错误提示。
立即学习“PHP免费学习笔记(深入)”;
- 规则中
fileSize或size必须传整数字节值,例如:'fileSize' => 2097152(即 2MB),'size' => 5242880(即 5MB) - 不能写字符串单位:
❌'fileSize' => '2M'、'size' => '5MB'—— 框架不解析,会静默当 0 处理 - 必须通过
$file->validate($rule)显式调用才生效,写在配置里或控制器数组中不触发校验 - 若需禁止空上传,额外加
require;若要校验类型,配合fileExt:jpg,png(扩展名全小写,不含点)
进阶建议:提前拦截与防攻击
光靠 validate 校验不够安全——恶意用户上传 500MB 文件,PHP 可能已把临时目录塞满再报错。可加中间件做轻量前置判断:
- 读取
Content-Length请求头(适用于标准 multipart 表单):
若超过阈值(如 20MB),直接返回 JSON 错误,不进入后续流程 - 注意:该方式在分块传输(chunked encoding)下不可靠,此时必须依赖 Nginx 层限流
- 对图片类文件,把
fileSize规则放在image或fileExt前面,避免先解码大图导致内存溢出



















