Laravel上传3GB视频报错:Request Entity Too Large及419页面过期
解决Laravel上传3GB视频报错的问题
错误原因拆解
你遇到三个核心问题:
- Apache请求实体过大:仅修改PHP配置不够,Apache自身也限制了请求体的大小
- Laravel 419页面过期:大文件上传耗时久,导致CSRF令牌或会话超时
- 代码验证规则限制:表单验证里的
max:380928仅允许约372MB的文件,远低于3GB的需求
分步解决
1. 修正代码中的文件大小验证规则
验证规则里的max参数单位是KB,3GB对应的KB数值是3*1024*1024=3145728,同时清理无效代码:
if($request->has('videos_path')){ $request->validate([ 'videos_path'=>'required|file|max:3145728|mimetypes:video/mp4', // 改为3GB对应的KB值 ]); $extension = strtolower($request->videos_path->extension()); $filename = time() . rand(100, 999) . '.' . $extension; // 注:getClientOriginalName是方法,不能直接赋值,以下无效代码已删除 // $request->videos_path->getClientOriginalName = $filename; $request->videos_path->move('assets/admin/uploads/movies/videos', $filename); $data['videos_path']= 'assets/admin/uploads/movies/videos/'. $filename; }
2. 调整Apache的请求体大小限制
编辑Apache的httpd.conf配置文件,或项目根目录的.htaccess文件,添加以下配置:
# 设置最大请求体为4GB(与php.ini的post_max_size=4096M对应) LimitRequestBody 4294967296
如果使用.htaccess,需确保Apache配置中开启了AllowOverride All,允许该配置生效。
3. 解决Laravel 419页面过期问题
- 延长会话有效期:编辑
config/session.php,修改会话时长(单位:分钟),比如设置为24小时:'lifetime' => 1440, 'expire_on_close' => false, - 确保CSRF令牌正确:表单中必须包含
@csrf指令;若用AJAX上传,需在请求头携带令牌:// AJAX上传示例 $.ajax({ url: '/your-upload-url', type: 'POST', data: formData, headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, // 其他上传配置... }); - 增加PHP执行时间:在
php.ini中补充配置:max_execution_time=1080
4. 验证配置生效
修改完成后,重启Apache和PHP服务,通过phpinfo()确认PHP配置已正确加载,再测试上传。
内容的提问来源于stack exchange,提问作者nayef atef
相关产品推荐
相关产品推荐

