laravel自身不控制底层上传大小上限,必须同步修改php.ini中upload_max_filesize和post_max_size(后者≥前者),并配置nginx的client_max_body_size或apache的limitrequestbody,否则请求在到达laravel前就被拦截,导致413或500错误。

直接改 php.ini,Laravel 自身不控制底层上传大小上限,只做验证层检查;改错位置或漏配 Web 服务器参数,上传照样失败。
PHP 层限制必须调:upload_max_filesize 和 post_max_size
这两个值是硬门槛,Laravel 还没开始处理请求,PHP 就已拒绝。常见错误现象是 413 Payload Too Large 或直接 500 且日志里报 POST Content-Length of XXX bytes exceeds the limit。
-
upload_max_filesize控制单个文件最大体积(如100M) -
post_max_size必须 ≥upload_max_filesize,它管整个 POST 请求体(含其他字段、多个文件、边界符等),建议设为120M预留余量 - 别忘了同步调
memory_limit(至少256M)和max_execution_time(大文件读写耗时长,设600更稳) - 改完必须重启 PHP-FPM 或 Apache/Nginx,
php -i | grep -E 'upload_max|post_max'可验证是否生效
Nginx 或 Apache 也得同步放开
Web 服务器在 PHP 之前就可能拦截大请求体,导致 Laravel 根本收不到请求。
- Nginx:在
server或location块里加client_max_body_size 120m;,单位支持m或MB - Apache:在
.htaccess或httpd.conf加LimitRequestBody 125829120(即 120MB 字节数) - 注意:Nginx 的
client_max_body_size和 PHP 的post_max_size必须一致或前者更大,否则请求被 Nginx 拦截,Laravel 无从知晓
Laravel 验证规则不能替代底层配置
max:102400 这类规则只在 PHP 成功解析请求后才执行,如果底层已拒收,验证根本不会跑。
- 验证规则只起二次校验作用,比如限制用户单次上传不超过 50MB,哪怕服务器允许 100MB
- 数组上传(
files.*)需注意:max:102400是每个文件的限制,不是总和;要验总大小得用自定义规则(如ArraySize) -
config/filesystems.php里的max_file_size不是标准 Laravel 配置项,官方文档未定义,多数情况是第三方包(如 Laravel File Manager)私有字段,对原生上传无效
上传 >100MB 文件必须分片,别硬扛
即使所有配置拉满,单次请求上传超大文件仍极易因网络抖动、超时、内存溢出失败,这不是 Laravel 能解决的问题。
- 前端用
File.prototype.slice()切片,每片 ≤5MB,带identifier、chunkNumber、totalChunks - 后端接收时禁用
$request->file()(会尝试加载整个 multipart body),改用$request->getContent()原始流写入临时目录 - 合并逻辑必须异步(队列),且校验分片数量与最终文件哈希,否则数据损坏难察觉
最易被忽略的是 Nginx/Apache 与 PHP 参数的协同关系——三者中任意一个卡住,上传就断在半路,而错误提示往往指向 Laravel,实际根子不在框架里。











