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

Yii2多文件上传成功但仅首个文件信息存入数据库求助

解决Yii2多文件上传仅首个文件存入数据库的问题

这个问题的核心原因很明确:你在循环中一直复用同一个Resource3d模型实例,导致后续的save()操作其实是在更新第一条插入的记录,而不是创建新的记录。

问题分析

第一次循环时,$model->save()会向数据库插入1.jpg的记录;第二次循环你修改了$model的path和name为2.jpg的信息,再调用save()时,因为模型已经有了主键(从第一次插入获得),Yii会执行更新操作,把第一条记录改成2.jpg的信息;第三次循环同理,最终数据库里只会留下最后一个文件的记录(你看到的是1.jpg可能是调试时的特殊情况,但本质逻辑是错误的)。

修复方案

在foreach循环内部,每次创建一个新的Resource3d实例,让每个文件对应一条新的数据库记录。修改后的控制器代码如下:

public function actionCreate() { 
    $model = new Resource3d(); 
    if ($model->load(Yii::$app->request->post())) { 
        $model->files = UploadedFile::getInstances($model, 'files'); 
        foreach ($model->files as $file){ 
            // 为每个文件新建一个模型实例
            $newModel = new Resource3d();
            
            // 如果你的表单还有其他需要提交的字段(比如分类、描述等),记得复制原模型的对应值
            // 示例:$newModel->category_id = $model->category_id;
            
            $file->saveAs('uploads/resource3d/' . $file->baseName . $file->extension); 
            $newModel->path = '../web/uploads/resource3d/'. $file->baseName . $file->extension; 
            $newModel->name = $file->baseName; 
            
            // 可选:添加错误调试,方便排查保存失败的问题
            if (!$newModel->save()) {
                var_dump($newModel->errors);
                exit;
            }
        } 
        return $this->redirect(['index']); 
    } else { 
        return $this->render('create', [ 
            'model' => $model, 
        ]); 
    } 
}

模型代码说明

你的模型代码基本无需修改:

  • public $files; 用于接收多文件上传的实例
  • rules()里的['files', 'file', 'skipOnEmpty' => false, 'maxFiles' => 0]配置正确,maxFiles => 0表示允许上传任意数量的文件。

内容的提问来源于stack exchange,提问作者Sao Ho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:43:51