yii2: загрузка файлов и изображений на сервер

Загрузка файлов и изображений в 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 загрузку файлов, так же пишите об этом, возможно напишу статью.

Комментарии

  1. Влад

    Ответить

    • admin

      Ответить

  2. Артем

    Ответить

    • admin

      Ответить

      • Артем

        Ответить

        • admin

          Ответить

          • Артем

        • Славентий

          Ответить

  3. admin

    Ответить

    • Артем

      Ответить

      • admin

        Ответить

        • Артем

          Ответить

          • Сергей

  4. Анечка

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован.