Laravel多表单多图片上传问题:图片无法存入milestone_files表
Laravel多表单多图片上传修复方案
1. 修复表单文件字段的name属性(Blade + jQuery)
使用multiple上传多文件时,字段name必须以[]结尾,后端才能正确接收文件数组。
修改Blade中的文件输入
原代码:
<input type="file" class="form-control" name="addmore[0][file]" id="file" multiple>
改为:
<input type="file" class="form-control" name="addmore[0][file][]" id="file" multiple>
修改jQuery动态添加的文件输入
原代码:
<input type="file" class="form-control" name="addmore['+ i +'][file]" id="file" multiple>
改为:
<input type="file" class="form-control" name="addmore['+ i +'][file][]" id="file" multiple>
2. 修复控制器中的文件路径错误
原代码中文件路径缺少目录分隔符,会导致存储路径无效:
$img_url = 'upload/milestone' . $fileName;
改为:
$img_url = 'upload/milestone/' . $fileName;
同时建议添加目录存在性检查,避免上传失败:
// 引入File门面 use Illuminate\Support\Facades\File; // 在文件移动前添加 $upload_path = public_path("upload/milestone"); if (!File::exists($upload_path)) { File::makeDirectory($upload_path, 0755, true); }
3. 确保模型$fillable配置正确
Milestone模型
protected $fillable = ['project_id', 'name', 'description', 'from', 'to', 'file'];
MilestoneFile模型
protected $fillable = ['milestone_id', 'manager_file'];
4. 优化验证规则(可选)
为数组类型的文件字段添加更严谨的验证:
$request->validate([ 'project_id' => 'required', 'addmore.*.name' => 'required', 'addmore.*.description' => 'required', 'addmore.*.from' => 'required', 'addmore.*.to' => 'required', 'addmore.*.file' => 'nullable|array', // 新增数组验证 'addmore.*.file.*' => 'file|max:10240', ]);
修改后的完整控制器代码
use Illuminate\Support\Facades\File; public function store(Request $request){ $request->validate([ 'project_id' => 'required', 'addmore.*.name' => 'required', 'addmore.*.description' => 'required', 'addmore.*.from' => 'required', 'addmore.*.to' => 'required', 'addmore.*.file' => 'nullable|array', 'addmore.*.file.*' => 'file|max:10240', ]); $project_id = $request->project_id; $milestones = $request->addmore; foreach ($milestones as $index => $milestone) { $milestone['project_id'] = $project_id; $created_milestone = Milestone::create($milestone); if ($request->hasFile("addmore.$index.file")) { $files = $request->file("addmore.$index.file"); $upload_path = public_path("upload/milestone"); if (!File::exists($upload_path)) { File::makeDirectory($upload_path, 0755, true); } foreach ($files as $file) { $fileName = rand(0, 999) . time() . '.' . $file->getClientOriginalExtension(); $file->move($upload_path, $fileName); $img_url = 'upload/milestone/' . $fileName; MilestoneFile::create([ 'manager_file' => $img_url, 'milestone_id' => $created_milestone->id ]); } } } return redirect()->back()->with('success', 'Milestones added successfully'); }
内容的提问来源于stack exchange,提问作者Muhammad Muzammil
相关产品推荐
相关产品推荐

