我正试图用新名称保存上传的文件,因此我必须再次更新文件属性以赋予它新名称,以避免数据库中的文件名与目录中真实文件的名称不匹配。
但文件属性类型是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]);
}
}