文档首页> 常见问题> 上传大文件总是失败

上传大文件总是失败

发布时间:2026-02-28 20:01        更新时间:2026-03-01 07:26
小图片传得动,几百 MB 的压缩包一传就断,上传失败通常不是网络一条原因,而是三处大小与时长限制叠加的结果。 ## 网页服务器的体积上限 Nginx(常见的 Web 服务与反向代理软件)默认请求体上限只有 1MB,超了直接返回 413 错误。改 http 或 server 段: client_max_body_size 500m; 改完 nginx -t 检查语法,再 systemctl reload nginx 平滑生效。Apache 对应 LimitRequestBody 指令。很多"传到一半秒断"的现象,根子就在这一行配置上。 确认改动有没有生效也有直接办法:curl -I 请求一次上传接口看返回码,配置改了却忘了 reload,参数永远停在旧值,413 也就照旧出现。 ## 脚本层的时长与上限 PHP 站点还要动 php.ini 里的一组参数: upload_max_filesize = 500m post_max_size = 500m max_execution_time = 300 memory_limit = 256m 注意 post_max_size 要大于等于 upload_max_filesize。改完 PHP-FPM(PHP 的进程管理服务)需要重启:systemctl restart php-fpm。另外 CLI 与 FPM 用的是两份配置:php -i 看的是命令行的,网页上传走的是 FPM 的,phpinfo() 输出里 Loaded Configuration File 一栏才是网页环境真正加载的文件,改错白改。用 php -i | grep upload_max_filesize 确认生效值,别只看网页管理工具里显示的数字,两者不一致的情况很常见。 ## 超时与磁盘这两个暗坑 大文件传输时间长,反向代理的读超时若只有 60 秒也会中断,Nginx 侧对应 fastcgi_read_timeout 或 proxy_read_timeout,按文件大小和带宽估算后适当调大。PHP 侧还有两个独立的时长参数:max_input_time 管接收数据的耗时,PHP-FPM 的 request_terminate_timeout 会中途掐断长请求,大文件场景一并调大。 磁盘同样要检查两个位置:上传临时目录(PHP 的 upload_tmp_dir,默认 /tmp)所在分区要装得下一个完整文件,df -h 看一眼,磁盘接近满时上传会在中途失败。 排查思路是把链路拆开:看返回码对号入座,413 找体积上限,504 找超时,传输中断再看临时目录和磁盘。三处配置依次核对,比盲目把所有参数调大更有效。超过 1GB 的文件干脆绕开网页通道,改用分片上传方案,稳定性不在一个量级。还有个容易忽略的参数 client_body_buffer_size:缓冲太小时大请求体直接落临时文件,临时目录容量不足或路径异常,同样表现为上传怪异失败。