如何在Laravel框架下实现图片和视频同时上传功能
问题原因
- 图片上传逻辑执行完成后直接返回了响应,后续视频上传的代码完全不会执行,这是视频上传失败的核心原因
- 视频上传代码块中获取文件名时,错误调用了
$request->file->getClientOriginalName(),应该使用视频字段对应的$request->video->getClientOriginalName(),否则会抛出字段不存在错误 - 冗余代码
$file = new Film();没有实际作用,可直接删除 - 视频验证规则缺少文件大小限制,若服务端(php.ini、nginx等)的上传大小阈值小于视频体积,也会导致上传失败
修复后代码
// 验证规则补充视频大小限制,可根据需求调整max数值(单位KB,204800即200M) $request->validate([ 'title'=> 'required', 'description' => 'required', 'file' => 'required|mimes:jpg,jpeg,png|max:2048', 'video' => 'required|mimes:mp4,mpeg|max:204800' ]); $film= Film::create([ 'title' => $request->title, 'slug' => Str::slug($request->title), 'description' => $request->description, 'user_id' => auth()->id() ]); // 处理图片上传 if($request->file('file')) { $file_name = time().'_'.$request->file->getClientOriginalName(); $file_path = $request->file('file')->storeAs('uploads', $file_name, 'public'); // 合并为一次update操作,减少数据库查询 $film->update([ 'file' => $file_name, 'path' => $file_path ]); } // 处理视频上传 if ($request->file('video')){ $file_name = time().'_'.$request->video->getClientOriginalName(); $file_path = $request->file('video')->storeAs('uploads', $file_name, 'public'); $film->update([ 'video' => $file_name, 'videoPath' => $file_path ]); } // 所有上传逻辑处理完成后统一返回响应 return response()->json(['success'=>'File uploaded successfully.']);
额外注意事项
如果修改代码后仍无法上传大体积视频,请检查服务端配置:
- php.ini中修改
upload_max_filesize和post_max_size为大于视频体积的数值 - Nginx配置中添加
client_max_body_size 200M;(数值根据需求调整),Apache则调整LimitRequestBody配置
内容的提问来源于stack exchange,提问作者Abdou
相关产品推荐
相关产品推荐

