Загрузка файлов и изображений в yii2 реализуется с помощью класса yii\web\UploadedFile. Так же нам потребуется модель для взаимодействия с этим классом. А контроллер будет реализовывать это взаимодействие. Начнем с создания модели, у меня класс будет называться UploadForm :
Здесь все достаточно просто, объявляем публичное свойство $file, в которое будем сохранять файл и задаем правила валидации, где ключ file означает, что данное поле должно быть файлом, а extension — допустимые расширения файла. С помощью свойства skipOnEmpty = false делаем загрузку файла обязательным.
Теперь создадим контроллер:
Здесь мы подключаем класс раннее созданной модели(UploadForm) и ранее упомянутый класс для загрузки файлов в yii2 — use yii\web\UploadedFile. Прежде чем принимать файлы на сервере, мы должны отправить их из браузера. Для этого объявим экземпляр класса модели и передадим его в представление.
Теперь мы можем создать форму для загрузки файлов в представлении:
С помощью виджета ActiveForm, создаем форму и обязательно указываем опции [‘options’ => [‘enctype’ => ‘multipart/form-data’]], для корректной загрузки файла. С помощью метода field($model, ‘file’)->fileInput() выводим на экран поле загрузки изображения. Теперь все готово для того что бы отправить файл на сервер. Возвращаемся в наш контроллер и напишем обработчик POST запроса в котором мы и будем сохранять файл:
С помощью условия, проверяем является ли, запрос типа POST. Если да то в поле file загружаем файлы с помощью статического метода getInstance класса UploadedFile, куда передаем объект модели и название поля файла. Далее выполняем валидацию, если все верно, вызываем метод saveAs c одним параметром — путь к файлу включая название. Переменная Yii::$app->params[‘pathUploads’] у меня равна realpath(dirname(__FILE__)).’/../web/img/user_photo/ , а $model->file содержит в себе название файла. Соответственно у меня передается такой путь:
Для того что бы назначить новое имя для фото при загрузки в yii2 мы можем передавать в путь не название файла($model->file), а его расширение с помощью родительского свойства модели, extension. Параметр пути теперь будет выглядеть так:
Где «123» — имя файла и путь соответственно будет такой:
На это все. Пишите вопросы и отзывы в комментариях. А так же кому интересно узнать как сделать современную ajax загрузку файлов, так же пишите об этом, возможно напишу статью.