必须同步调整PHP、Web服务器和ThinkPHP三层配置:修改php.ini中upload_max_filesize与post_max_size(后者≥前者),Nginx加client_max_body_size或Apache设LimitRequestBody,框架层调用$file->validate()校验字节级size规则并重启对应服务。

ThinkPHP导入Excel时遇到“上传文件过大”报错或被静默截断,必须同步调整PHP底层、Web服务器和框架层三处限制,缺一不可。只改其中一层,其余两层仍会拦截请求,导致上传失败或数据不完整。
修改PHP核心上传参数
PHP解析请求前会强制校验两个硬性参数:upload_max_filesize控制单文件上限,post_max_size控制整个POST请求体(含所有字段+文件)总大小。二者必须同时调大,且post_max_size必须大于upload_max_filesize,否则即使只传一个Excel也会被截断。
第一步:用phpinfo()确认当前生效的php.ini路径,不要编辑错误配置文件。
第二步:打开php.ini,找到并修改以下两行——【upload_max_filesize = 50M】,【post_max_size = 60M】。注意单位支持M/K,但不能写成50MB或50m,大小写敏感。
立即学习“PHP免费学习笔记(深入)”;
第三步:检查max_execution_time是否≥300,大Excel解析耗时长,超时会导致504 Gateway Timeout而非文件大小错误。
第四步:保存后执行systemctl restart php-fpm(或对应版本命令),再访问phpinfo页面验证数值已更新——仅改文件不重启,配置完全无效。
配置Nginx或Apache请求体限制
Nginx/Apache会在请求抵达PHP之前独立拦截超限请求体,若未放宽,直接返回413错误,PHP日志里根本不会记录这次请求。
方法一(Nginx):编辑站点server块配置文件,在location ~ \.php$ {}内添加【client_max_body_size 60M;】。切勿写在http全局块,否则影响所有虚拟主机。
方法二(Apache):在虚拟主机配置或项目根目录.htaccess中添加LimitRequestBody指令,值为字节单位——【LimitRequestBody 62914560】(即60MB)。若.htaccess被禁用,则必须改vhost配置。
执行nginx -t && nginx -s reload验证并重载;Apache则运行apachectl graceful。这一步漏掉,前端上传界面可能卡死无响应。
设置ThinkPHP框架层校验规则
框架层校验是应用逻辑级预检,仅在PHP成功接收文件后触发,用于细化业务规则(如单字段限制),不替代底层配置,但必须显式调用validate()才生效。
在控制器中获取上传对象后,立即调用validate方法:
$file = $this->request->file('excel');
$file->validate(['size' => 52428800, 'ext' => ['xlsx', 'xls']]);
注意size单位是字节,不是M或MB;ext值必须全小写且不含点。如果用新版ThinkPHP 6.x Filesystem组件,还需检查config/filesystem.php中disk驱动是否启用max_size选项并设为整数。
旧版ThinkPHP 3.2需在Upload类实例化时传入maxSize参数,例如new \Think\Upload(['maxSize' => 52428800])。



















