保存文件实例后如何将字符串分配给文件属性?
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}")
.
我正在尝试用一个新的名字保存我上传的文件,所以我必须再次更新文件属性给它一个新的名字,以避免数据库中的文件名和真实文件名不匹配在我的目录中。
但是文件属性类型是文件,所以我每次执行这个过程都会得到一个错误说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}")
.