Я пытаюсь сохранить загруженный файл под новым именем, поэтому я должен снова обновить атрибут файла, чтобы присвоить ему новое имя, чтобы избежать несоответствия между именем файла в БД и именем реального файла в моем каталоге.
Но тип атрибута файла — файл, поэтому я получу сообщение об ошибке 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]);
}
}