Загрузка файлов в Yii выполняется с помощью модели-формы, её правил валидации и некоторого кода в контроллере. Давайте
посмотрим подробнее, что необходимо для загрузки файлов.
Загрузка файлов в Yii, обычно, выполняется при помощи класса [[yii\web\UploadedFile]], который представляет каждый загруженный файл в виде объекта `UploadedFile`. Используя [[yii\widgets\ActiveForm]] и [модели](structure-models.md) можно легко создать безопасный механизм загрузки файлов.
Загрузка одного файла
---------------------
Для начала требуется создать модель, которая будет обрабатывать загрузку файлов. Создайте `models/UploadForm.php` со
следующим содержанием:
## Создание моделей <spanid="creating-models"></span>
Как и в случае с обработкой текстового ввода, для загрузки файла можно создать класс модели и использовать его атрибут для хранения экземпляра объекта `UploadedFile`, содержащего параметры загруженного файла. Так же, возможно использование правил валидации модели для проверки загруженного файла. Например,
В коде что выше, мы создали модель `UploadForm` с свойством `file`, которое станет в HTML форме `<input type="file">`.
В правилах валидации это свойство описывается правилом `file`, которое используется [[yii\validators\FileValidator|FileValidator]].
В примере выше атрибут `imageFile` используется для хранения экземпляра загруженного файла. Правило валидации `file`, которое, при помощи валидатора [[yii\validators\FileValidator]], проверяет расширение загруженного файла на соответствие с `png` или `jpg`. Метод `upload()` выполняет валидацию и сохраняет загруженный файл на сервере.
Валидатор `file` позволяет проверять расширение, размер, тип MIME и другие параметры загруженного файла. Подробности в разделе [Встроенные валидаторы](tutorial-core-validators.md#file).
> Подсказка: При загрузке изображений лучше использовать соответствующий валидатор `image`. Данный валидатор реализован классом [[yii\validators\ImageValidator]] и позволяет проверить корректность загруженного изображения при помощи [расширения Imagine](https://github.com/yiisoft/yii2-imagine).
### Вид формы
Далее создайте вид, который будет выводить форму:
## Представление <spanid="rendering-file-input"></span>
Теперь можно создать представление, отображающее поле загрузки файла:
`'enctype' => 'multipart/form-data'` необходимо для того, чтобы форма поддерживала отправку файлов. `fileInput()`
формирует файловый элемент формы.
Важно помнить, что для корректной загрузки файла, необходим параметр формы `enctype`. Метод `fileInput()` выведет тег `<input type="file">`, позволяющий пользователю выбрать файл для загрузки.
### Контроллер
## Загрузка <spanid="wiring-up"></span>
Теперь создайте контроллер, который соединит вид формы и модель:
Теперь напишем код действия контроллера, который объединит модель и представление.
```php
namespace app\controllers;
@ -81,10 +87,10 @@ class SiteController extends Controller
Если вы используете "basic" шаблона приложения, то директория `uploads` должна быть создана внутри `web`.
Всё. Откройте форму и попробуйте загрузить файл. Он должен загрузиться в `basic/web/uploads`.
Валидация
----------
Очень часто требуется разрешить загрузку только определённых файлов или установить обязательную загрузку. Ниже мы
рассмотрим некоторые общие настройки правила `file`.
### Обязательная загрузка файла
Если требуется обязательная загрузка файла, используйте `skipOnEmpty`:
```php
public function rules()
{
return [
[['file'], 'file', 'skipOnEmpty' => false],
];
}
```
### тип MIME
При получении данных, отправленных из формы, для создания из загруженного файла экземпляра объекта `UploadedFile`, вызывается метод [[yii\web\UploadedFile::getInstance()]]. Далее всю работу по валидации и сохранению загруженного файла на сервере берет на себя модель.
Разумно проверять тип загружаемого файла. Для этого FileValidator имеет свойство `$extensions`:
```php
public function rules()
{
return [
[['file'], 'file', 'extensions' => 'gif, jpg'],
];
}
```
## Загрузка нескольких файлов <spanid="uploading-multiple-files"></span>
По-умолчанию, эта проверка будет также проверять MIME-тип данных, в соответствии с расширением. Для gif это будет
`image/gif`, для `jpg` - `image/jpeg`.
Для загрузки нескольких файлов достаточно внести в предыдущий код несколько небольших изменений.
Обратите внимание, что некоторые MIME-типы могут быть определены неверно через fileinfo, расширение PHP, которое
использует FileValidator. Например, `csv` файлы будут определены как `text/plain` вместо корректного `text/csv`.
Вы можете отключить такое поведение через установку свойства `checkExtensionByMimeType` в `false` и указать
корректный MIME-тип вручную:
Сначала нужно добавить в правило валидации `file` параметр `maxFiles` для ограничения максимального количество загружаемых одновременно файлов. Метод `upload()` нужно изменить для сохранения загруженных файлов по одному.
Для загрузки изображений вам может пригодиться валидатор [[yii\validators\ImageValidator|ImageValidator]]. Он проверяет
является ли файл изображением, которое затем может быть обработано или сохранено с помощью [Imagine Extension](https://github.com/yiisoft/yii2-imagine).
Загрузка нескольких файлов
------------------------
namespace app\models;
Если вам нужно загрузить несколько файлов одновременно, то необходимо внести некоторые корректировки.
В представлении, в вызов метода `fileInput()`, нужно добавить параметр `multiple` для того, чтобы поле *input* позволяло выбирать несколько файлов одновременно:
В действии контроллера нужно заменить вызов `UploadedFile::getInstance()` на `UploadedFile::getInstances()` для присвоения атрибуту модели `imageFiles` массива объектов `UploadedFile`.
```php
namespace app\controllers;
@ -237,12 +175,10 @@ class SiteController extends Controller