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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:17:51