将上传的文件复制到新的Yii2模型时出现问题

Problem Copying Uploaded Files to a New Yii2 Model

提问人:Abdelilah Dahdahi 提问时间:11/3/2023 最后编辑:Abdelilah Dahdahi 更新时间:11/3/2023 访问量:35

问:

我正在开发一个 Yii2 应用程序,在尝试复制模型及其上传文件时遇到了一个问题。我正在使用 Yii2 的 UploadedFile 进行文件上传。挑战在于上传的文件 (imageFiles) 未成功复制到新模型。这是我的代码:

public function actionDuplicate($id)
{
    $existingModel = $this->findModel($id);
    $model = new Task();
    
    // Copy attributes from the existing model
    $model->attributes = $existingModel->attributes;

    // Manually copy the imageFiles property if it exists
    if (isset($existingModel->imageFiles) && is_array($existingModel->imageFiles)) {
        $model->imageFiles = [];
        foreach ($existingModel->imageFiles as $file) {
            $model->imageFiles[] = $file;
        }
    }

    // Reset primary key
    $model->id = null;

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        // renders view
    } else {
        // Render the create form with the new model
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

代码正确复制了大多数属性,但 imageFiles 属性未包含在新模型中。我已经仔细检查了源模型($existingModel)中是否存在imageFiles属性,并且它是一个数组。可能导致此问题的原因,以及如何确保将 imageFiles 正确复制到新模型

编辑:imageFiles 属性是在 Model 中声明的文件数组,它使用以下上传函数进行处理:

public function upload()
    {
        if ($this->validate()) {
            $path = Yii::getAlias('@doc_attivita') . "/" . $this->id;
            FileHelper::createDirectory($path, $mode = 0775, $recursive = true);
            foreach ($this->imageFiles as $file) {
                $file->saveAs($path . "/" . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
php yii yii2-basic-app

评论

0赞 Michal Hynčica 11/3/2023
我的猜测是该属性不是常规模型属性。它可能是关系字段或由模型内部逻辑填充的东西。如果不更多地了解如何在模型中定义或填充该字段,我们就无法真正帮助解决问题。imageFiles
0赞 Abdelilah Dahdahi 11/3/2023
@MichalHynčica是的,它确实是在模型中声明的文件数组: /** * var UploadedFile[] */ public $imageFiles;
0赞 Abdelilah Dahdahi 11/3/2023
@MichalHynčica我刚刚编辑了这篇文章,你能检查一下吗?
1赞 Michal Hynčica 11/4/2023
问题是在复制现有模型时无法使用。该类只能处理刚刚在当前 POST 请求中上传的文件。如果要复制现有文件,必须执行以下操作: 1. 复制不带文件的模型。2. 复制相关文件。3. 将文件副本链接到在第一步中创建的新模型。这些步骤的具体实现取决于文件在实现中的存储和链接方式。yii\web\UploadedFile

答: 暂无答案