You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 10:51:04