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


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

我正试图用新名称保存上传的文件,因此我必须再次更新文件属性以赋予它新名称,以避免数据库中的文件名与目录中真实文件的名称不匹配。

但文件属性类型是file,所以每次执行此过程时,我都会收到一个错误,说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]);
    }
}

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

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

另一个字段是接收实际的文件上传。该字段需要以类型file的形式存在于规则中,并在模型类中声明为属性。

假设您的customer表已经有一个名为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}")

在图像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]);
}
}