как присвоить строку атрибуту файла после сохранения экземпляра файла?

Я пытаюсь сохранить загруженный файл под новым именем, поэтому я должен снова обновить атрибут файла, чтобы присвоить ему новое имя, чтобы избежать несоответствия между именем файла в БД и именем реального файла в моем каталоге.

Но тип атрибута файла — файл, поэтому я получу сообщение об ошибке 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]);
}
}

0

Решение

Вот ваше решение: вам нужно два разных поля.

Одно поле для хранения имени файла. Это поле будет сохранено в базе данных. Это поле вообще не должно быть установлено в ваших правилах, потому что вы никогда не получите его из форм.

Другое поле для получения фактической загрузки файла. Это поле должно существовать в ваших правилах как тип 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}"),

1

Другие решения

Сохранение модели после изображения 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]);
}
}
0

По вопросам рекламы [email protected]