От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii. Данная статья будет посвящена такой теме, как Yii2 изображения. Здесь мы посмотрим, как происходит загрузка и вывод загруженных изображений.
Итак, давайте затронем в данном цикле статей вопрос загрузки картинок. Операция, которая необходима практически на любом сайте: загрузка изображений товара в интернет-магазине или прикрепление картинки поста в блоге и т.д.
Сделать это на самом деле относительно просто. Нам нужно всего-то знать, что для работы с загруженным файлом необходимо обратиться к классу yii\web\UploadedFile, объект которого и содержит всю информацию о загруженном файле.
Давайте начнем с создания модели, которая будет осуществлять валидацию загружаемого файла (нам ведь нужен не любой файл, а именно изображение) и сохранять его в выбранную папку. Пусть наша модель называется UploadImage.

Фреймворк Yii2. Быстрый старт
Получите курс и узнайте, как с помощью фреймворка Yii2 разрабатывать веб-приложения на примере блога
Смотреть курс
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php namespace app\models; use yii\base\Model; use yii\web\UploadedFile; class UploadImage extends Model{ public $image; public function rules(){ return[ [['image'], 'file', 'extensions' => 'png, jpg'], ]; } public function upload(){ if($this->validate()){ var_dump($this->image); }else{ return false; } } } |
Как видим, в модели мы указали свойство $image, которое и будет отвечать за работу с загружаемым изображением. В методе rules использованы правила валидации для получаемого файла, которыми мы сообщаем, что во-первых, поле формы input должно быть корректным загружаемым файлом, а во-вторых, расширения этого файла должны быть png или jpg.
Ну и, наконец, у нас есть заготовка метода upload, который будет проверять, пройдена ли валидация, и пока что просто распечатывать на экран содержимое обеъекта.
Далее нам, конечно же, понадобится контроллер и представление. Давайте в классе SiteController создадим действие actionUpload, в котором и получим объект модели.
1 2 3 4 5 6 7 8 9 |
public function actionUpload(){ $model = new UploadImage(); if(Yii::$app->request->isPost){ $model->image = UploadedFile::getInstance($model, 'image'); $model->upload(); return; } return $this->render('upload', ['model' => $model]); } |
В экшене мы создаем объект модели и в свойство $image сохраняем информацию о загруженном файле. Также мы вызываем метод upload() модели, который написали на предыдущем шаге. Теперь создадим несложный вид — upload.php и обратимся к искомой странице с формой (//yii2/site/upload):
1 2 3 4 5 6 7 8 |
<?php use yii\widgets\ActiveForm; ?> <?php $form = ActiveForm::begin() ?> <?= $form->field($model, 'image')->fileInput() ?> <button>Загрузить</button> <?php ActiveForm::end() ?> |
Обратите внимание! Мы используем последнюю версию фреймворка. До версии 2.0.8 для формы при загрузке файлов обязательно нужно было добавлять атрибут enctype со значением multipart/form-data, вот таким образом:

Фреймворк Yii2. Быстрый старт
Получите курс и узнайте, как с помощью фреймворка Yii2 разрабатывать веб-приложения на примере блога
Смотреть курс
1 |
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> |
Теперь этого делать не обязательно, Yii сам добавит необходимый атрибут, если в форме есть поля типа file.
Ну что же, давайте попробуем загрузить файл через созданную форму. Если мы нигде не ошиблись, тогда метод upload модели распечатает данные загруженного изображения.
К слову, если это будет не картинка с разрешенными расширениями, тогда мы должны увидеть другую картину:
Давайте теперь внесем необходимые правки в код, чтобы загрузить и вывести его. Для начала метод upload модели.
1 2 3 4 5 6 7 |
public function upload(){ if($this->validate()){ $this->image->saveAs("uploads/{$this->image->baseName}.{$this->image->extension}"); }else{ return false; } } |
Здесь мы использовали метод saveAs, который сохранит файл по указанному пути. Мы будем сохранять картинку в папку uploads (создайте эту папку в директории web).
Теперь контроллер. Мы хотим не только загрузить картинку, но и реализовать ее вывод на экран (на практике, конечно же, нам потребуется сохранить путь к картинке в БД, но это тема отдельной статьи).
1 2 3 4 5 6 7 8 9 |
public function actionUpload(){ $model = new UploadImage(); if(Yii::$app->request->isPost){ $model->image = UploadedFile::getInstance($model, 'image'); $model->upload(); return $this->render('upload', ['model' => $model]); } return $this->render('upload', ['model' => $model]); } |
Ну и представление. Давайте проверим наличие изображения и добавим его вывод перед формой:
1 2 3 |
<?php if($model->image): ?> <img src="/uploads/<?= $model->image?>" alt=""> <?php endif; ?> |
В результате изображение должно быть загружено и успешно выведено сразу после сохранения в папку web\uploads.
Как видим, загрузка и вывод изображений в Yii — достаточно простая вещь. Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.

Фреймворк Yii2. Быстрый старт
Получите курс и узнайте, как с помощью фреймворка Yii2 разрабатывать веб-приложения на примере блога
Смотреть курс