Задать вопрос

Почему приходит пустой $_FILES?

вот представление
<?php use yii\helpers\Html;
    use yii\widgets\ActiveForm; ?>
    
    <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
    <?= $form->field($model, 'files')->fileInput(); ?>
        <div class="form-group">
            <?= Html::submitButton( Yii::t('app','CREATE'), [ 'btn btn-primary']) ?>
        </div>
    
    <?php ActiveForm::end(); ?>

вот модель
class Parser extends Model
    {
        public $files;
        public function rules()
        {
            return [
               [['files'], 'file', 'skipOnEmpty' => true, 'extensions' => 'xml, yml']
    
            ];
        }
    }

вот контролер
$execelparser = new Parser();
        if ($execelparser->load(Yii::$app->request->post())) {
            $parsers = Yii::$app->request;
            $execelparser->files = UploadedFile::getInstance($execelparser, 'files');
             return var_dump($execelparser->files);
        }else{
            return $this->render('parser',[
                'model'     => $execelparser
            ]);
        }

сюда я вообще не попадаю
if ($execelparser->load(Yii::$app->request->post())){}

потому что ничего не приходит если вывесть вот так
return var_dump($execelparser->files);
получаю вот такой ответ
/var/www/magaz.lc/backend/controllers/GodsController.php:288:
    object(backend\models\Parser)[89]
      public 'files' => null
      private '_errors' (yii\base\Model) => null
      private '_validators' (yii\base\Model) => null
      private '_scenario' (yii\base\Model) => string 'default' (length=7)
      private '_events' (yii\base\Component) => 
        array (size=0)
          empty
      private '_behaviors' (yii\base\Component) => null

если так
var_dump(Yii::$app->request);
то вот такой ответ
var/www/magaz.lc/backend/controllers/GodsController.php:269:
    object(yii\web\Request)[8]
      public 'enableCsrfValidation' => boolean true
      public 'csrfParam' => string '_csrf-backend' (length=13)
      public 'csrfCookie' => 
        array (size=1)
          'httpOnly' => boolean true
      public 'enableCsrfCookie' => boolean true
      public 'enableCookieValidation' => boolean true
      public 'cookieValidationKey' => string 'a2vnMIxR40yJ_kbBhCdOEMBt-NkTl6TO' (length=32)
      public 'methodParam' => string '_method' (length=7)
      public 'parsers' => 
        array (size=0)
          empty
      private '_cookies' => null
      private '_headers' => null
      private '_rawBody' => null
      private '_bodyParams' => null
      private '_queryParams' => null
      private '_hostInfo' => null
      private '_baseUrl' => string '/admin' (length=6)
      private '_scriptUrl' => string '/backend/web/index.php' (length=22)
      private '_scriptFile' => null
      private '_pathInfo' => string 'gods/parser' (length=11)
      private '_url' => string '/admin/gods/parser' (length=18)
      private '_port' => null
      private '_securePort' => null
      private '_contentTypes' => null
      private '_languages' => null
      private '_csrfToken' => null
      private '_isConsoleRequest' (yii\base\Request) => null
      private '_events' (yii\base\Component) => 
        array (size=0)
          empty
      private '_behaviors' (yii\base\Component) => null
      private '_scriptFile' (yii\base\Request) => null

объясните мне что я делаю не так ?
  • Вопрос задан
  • 447 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
qonand
@qonand
Software Engineer
Загрузка файла происходит несколько другим путем, чем передача обычных параметров. Когда Вы отправляете форму происходит следующее
1. На сервер загружается файл
2. Метод UploadedFile::getInstance($execelparser, 'files') сначала на основе модели и названия атрибута формирует некий идентификатор файла, по которому потом достает загруженный файл и возвращает
3. Соответственно $execelparser->files = UploadedFile::getInstance($execelparser, 'files') записывает полученный файл в модель

Т.е. пока этот код не отработает у Вас в модели ничего не будет, т.к. метод load(Yii::$app->request->post()) не может загрузить файл в модель. По сути дела Вам достаточно заменить
if ($execelparser->load(Yii::$app->request->post()))

на
if (Yii::$app->request->isPost)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы