Spec-Zone.ru › Yii 2.0

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

  1. Создание моделей
  2. Вывод поля ввода файла
  3. Подключение
  4. Загрузка нескольких файлов

Загрузка файлов в Yii обычно выполняется с помощью yii\web\UploadedFile, который инкапсулирует каждый загруженный файл как объект UploadedFile. В сочетании с yii\widgets\ActiveForm и моделями вы можете легко реализовать безопасный механизм загрузки файлов.

Создание моделей

Как и при работе с обычными текстовыми полями ввода, для загрузки одного файла вы создадите класс модели и используете атрибут модели для хранения экземпляра загруженного файла. Вы также должны объявить правило валидации для проверки загрузки файла. Например,

namespace app\models;

use yii\base\Model;
use yii\web\UploadedFile;

class UploadForm extends Model
{
    /**
     * @var UploadedFile
     */
    public $imageFile;

    public function rules()
    {
        return [
            [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],
        ];
    }
    
    public function upload()
    {
        if ($this->validate()) {
            $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
            return true;
        } else {
            return false;
        }
    }
}

В приведенном коде атрибут imageFile используется для хранения экземпляра загруженного файла. Он связан с правилом валидации file, которое использует yii\validators\FileValidator для обеспечения загрузки файла с расширением имени png или jpg. Метод upload() выполнит валидацию и сохранит загруженный файл на сервере.

Валидатор file позволяет проверять расширения файлов, размер, MIME-тип и т.д. Более подробную информацию см. в разделе Основные валидаторы.

Подсказка: Если вы загружаете изображение, вы можете рассмотреть использование валидатора image вместо него. Валидатор image реализован через yii\validators\ImageValidator, который проверяет, получил ли атрибут допустимое изображение, которое затем может быть сохранено или обработано с помощью расширения Imagine.

Вывод поля ввода файла

Далее создайте поле ввода файла в представлении:

<?php
use yii\widgets\ActiveForm;
?>

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

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

    <button>Submit</button>

<?php ActiveForm::end() ?>

Важно помнить, что вы добавляете опцию enctype в форму, чтобы файл мог быть правильно загружен. Вызов fileInput() отобразит тег <input type="file">, который позволит пользователям выбрать файл для загрузки.

Подсказка: начиная с версии 2.0.8, fileInput автоматически добавляет опцию enctype в форму при использовании поля ввода файла.

Подключение

Теперь в действии контроллера напишите код для подключения модели и представления для реализации загрузки файлов:

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;

class SiteController extends Controller
{
    public function actionUpload()
    {
        $model = new UploadForm();

        if (Yii::$app->request->isPost) {
            $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
            if ($model->upload()) {
                // file is uploaded successfully
                return;
            }
        }

        return $this->render('upload', ['model' => $model]);
    }
}

В приведенном коде при отправке формы вызывается метод yii\web\UploadedFile::getInstance() для представления загруженного файла как экземпляра UploadedFile. Затем мы полагаемся на валидацию модели, чтобы убедиться, что загруженный файл является допустимым, и сохраняем файл на сервере.

Загрузка нескольких файлов

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

Сначала вы должны изменить класс модели, добавив опцию maxFiles в правило валидации file, чтобы ограничить максимальное количество разрешенных к загрузке файлов. Установка maxFiles в 0 означает, что нет ограничений на количество файлов, которые можно загрузить одновременно. Максимальное количество файлов, разрешенных для одновременной загрузки, также ограничено директивой PHP max_file_uploads, которая по умолчанию равна 20. Метод upload() также должен быть обновлен для сохранения загруженных файлов по одному.

namespace app\models;

use yii\base\Model;
use yii\web\UploadedFile;

class UploadForm extends Model
{
    /**
     * @var UploadedFile[]
     */
    public $imageFiles;

    public function rules()
    {
        return [
            [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4],
        ];
    }
    
    public function upload()
    {
        if ($this->validate()) { 
            foreach ($this->imageFiles as $file) {
                $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
}

В файле представления вы должны добавить опцию multiple к вызову fileInput(), чтобы поле загрузки файлов могло принимать несколько файлов:

<?php
use yii\widgets\ActiveForm;
?>

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

    <?= $form->field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?>

    <button>Submit</button>

<?php ActiveForm::end() ?>

И, наконец, в действии контроллера вы должны вызвать UploadedFile::getInstances() вместо UploadedFile::getInstance(), чтобы назначить массив экземпляров UploadedFile атрибуту UploadForm::imageFiles.

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;

class SiteController extends Controller
{
    public function actionUpload()
    {
        $model = new UploadForm();

        if (Yii::$app->request->isPost) {
            $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles');
            if ($model->upload()) {
                // file is uploaded successfully
                return;
            }
        }

        return $this->render('upload', ['model' => $model]);
    }
}

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-input-file-upload.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API