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

Для мультизагрузки файлов нужно создать модель в каталоге models UploadForm.php

namespace app\models;

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

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

    public function rules()
    {
        return [
            [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4,'checkExtensionByMimeType'=>false],
        ];
    }
    
    public function upload()
    {
        if ($this->validate()) { 
            foreach ($this->imageFiles as $file) {
				$filename=Yii::$app->getSecurity()->generateRandomString(15);
				// echo $filename;
                $file->saveAs('uploads/' . $filename . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
}

Создадим функцию в контролере я создам функцию в контролере SiteController.php

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]);
    }

Далее создадим view upload в каталоге site

<?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() ?>

Структура моих каталогов
2016-08-01_08-34-21

7 комментариев на «“Загрузка нескольких файлов yii2”»

  1. Владимир:

    А как при этом сохранить ссылки на файлы, если допустим в БД под для этого отведено одно поле ?

    • TSergey:

      Можно сохранить через запятую, либо любой другой символ.

      • Владимир:

        А можно пример реализации такого метода сохранения и каким образом выводить список файлов потом?

        • TSergey:

          В базе имеется текстовое поле в котором хранится информация о всех файла. Информация хранится через запятую (1.jpg, 2.jpg, 3.jpg и т.д.). Далее во view

          $doc = trim($model->documenty); // очищаем
          $doc = substr($doc, 0, -1);// удаляем последнюю запятую
          $documenty=explode(‘,’, $doc);// делим на слова в итоге получаем массив из файлов, который можно вывести через цикл

          Вот пример.

          <div class="item «>

  2. КГБ:

    загружает только первый файл! думаю проблема в результате:
    Array ( [userFile] => Array ( [name] => Array ( [0] => IMG_20160923_151623.jpg [1] => IMG_20161020_134146.jpg [2] => IMG_20161020_134159.jpg [3] => IMG_20161020_134212.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg [2] => image/jpeg [3] => image/jpeg ) [tmp_name] => Array ( [0] => /tmp/phpix9DS5 [1] => /tmp/phpC3SAe8 [2] => /tmp/phpolcasb [3] => /tmp/php0B5NFf ) [error] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 ) [size] => Array ( [0] => 343872 [1] => 214032 [2] => 254336 [3] => 210584 ) ) )
    как сделать чтобы массив преобразовать в модели?

    • TSergey:

      Я тестировал этот код. Он стоит на рабочем проекте. Проверьте еще раз все ли правильно написано

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *