Загрузка файлов Yii2

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

Там показана загрузка и создание отдельной модели для загрузки файла, поэтому можно сделать более полноценную модель или пользоваться этой.

Ещё один вариант создания возможности загрузки файлов на сервер, вполне возможно код можно поправить или изменить и, конечно, не претендует на идеальный.

Создание модели
модель создается такая же как и все остальные, добавляешь лишь:

//свойство
public $uploadFile;

//правила валидации
public function rules(){
//здесь скорей всего уже есть другие правила, добавим для обработки загружаемого файла
return [
  [['uploadFile'],'file','skipOnEmpty'=>true, 'extension'=>'png, jpg'],
];

//создадим метод загрузки файлов
public function upload(){
if ($this->validate()) {
  $this->uploadFile->saveAs('uploads/'.$this->uploadFile->baseName.'.'.$this->uploadFile->extension);
return true;
} else {
return false;
}
}
}

в Controller

public function actionCreate()
    {
        $model = new Upload(); // Создаем новый экземпляр модели

        if ($model->load(Yii::$app->request->post())) {
            $model->uploadFile = UploadedFile::getInstance($model, 'uploadFile'); //загрузка файла

            if ($model->upload()) { //сохранение файла, если все удачно, то информацию о файле можно сохранить в какое-нибудь поле в БД. Так же здесь проходит валидация остальных полей
                $model->file = $uploadFolder.$model->uploadFile->name;
            } else {
                throw new HttpException(500, 'Файл не загрузился.');
            }

            $model->uploadFile = ''; //сбрасываем uploadFile, чтобы он не попал в обработку к save, ведь мы его уже обработали

            if ($model->save(false)) { //поскольку валидация уже прошла, второй раз её проводить смысла нет
                return $this->redirect(['view', 'id' => $model->id]);
            } else {
                throw new HttpException(500, 'Не сохранилось.');
            }
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

View

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

    <?= $form->field($model, 'uploadFile')->fileInput() ?>

   // и другие поля формы

<?php ActiveForm::end() ?>

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.