保存文件实例后如何将字符串分配给文件属性?

how to assign string to a file attribute after saving the file instance?

我正在尝试用一个新的名字保存我上传的文件,所以我必须再次更新文件属性给它一个新的名字,以避免数据库中的文件名和真实文件名不匹配在我的目录中。

但是文件属性类型是文件,所以我每次执行这个过程都会得到一个错误说please upload a file,这是我的create操作代码:

if(isset($_POST['Customers'])) {

    $model->attributes=$_POST['Customers'];
    $model->image = UploadedFile::getInstance($model, 'image');

    if($model->save()){

        $model->image->saveAs(getcwd()."/images/customers/CUST-".$model->id."-".$model->image);
        $model->image = "CUST-".$model->id."-".$model->image;

        if($model->save())
            return $this->redirect(['view', 'id' => $model->id]);
    }
}

在图像 SaveAs 调用后保存模型 .. 应该像

if(isset($_POST['Customers'])) {

$model->attributes=$_POST['Customers'];
$model->image = UploadedFile::getInstance($model, 'image');

if($model->validate()){

    $model->image->saveAs(getcwd()."/images/customers/CUST-".$model->id."-".$model->image);
    $model->image = "CUST-".$model->id."-".$model->image;

    if($model->save())
        return $this->redirect(['view', 'id' => $model->id]);
}
}

这是您的解决方案:您需要两个不同的字段。

一个字段是存储文件的名称。该字段将保存到数据库中。根本不应在您的规则中设置此字段,因为您永远不会从表单中获取它。

另一个字段是接收实际上传的文件。此字段需要作为 file 类型存在于您的规则中,并且还需要在您的模型 class 中声明为 属性.

假设您的 customer table 已经有一个名为 image.

的列
class Customer extends ActiveRecord
{
    public $imageFile;

    //...

    public function rules()
    {
        return [
            //...
            [['imageFile'], 'file'],
            [['imageFile'], 'required'],
            //...
        ];
    }

    //...
}

现在,在您的控制器中:

if (Yii::$app->request->isPost) {
    $model->load(Yii::$app->request->post());
    $model->imageFile = UploadedFile::getInstance($model, 'imageFile');

    if ($model->save()) {
        $model->refresh();

        //set image name
        $model->image = "CUST-".$model->id."-".$model->imageFile->name;

        //save file
        $model->imageFile->saveAs(getcwd()."/images/customers/".$model->image);

        //update model with file name
        $model->save();
    }
}

return $this->redirect(['view', 'id' => $model->id]);

使用别名获取上传文件夹也是个好主意。类似于 Yii::getAlias("@uploads/{$model->image}").