Upload не проходит валидацию

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
marsden
Сообщения: 23
Зарегистрирован: 2019.11.25, 09:28

Upload не проходит валидацию

Сообщение marsden »

Не пойму, в чем прикол. Сделал все по доке, модель

Код: Выделить всё

<?php

namespace api\models;

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

class UploadXlsx extends Model
{
    /**
     * @var UploadedFile
     */
    public $xlsxFile;
    public function rules()
    {
        return [
            [['xlsxFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'xlsx'],
        ];
    }


    public function upload()
    {
        if ($this->validate()) {
            $this->xlsxFile->saveAs('file.' . $this->xlsxFile->extension);
            return true;
        } else {
            return false;
        }
    }
}
Вызов из контроллера

Код: Выделить всё

        $model = new UploadXlsx();

        if (Yii::$app->request->isPost) {
            $model->xlsxFile = UploadedFile::getInstance($model, 'xlsxFile');
            if ($model->upload()) {
                // file is uploaded successfully
                return 'Ok';
            }
        }
Не проходит валидацию, $this->errors модели содержит

Код: Выделить всё

[
    'xlsxFile' => [
        'Загрузите файл.',
    ],
]
в логе

Код: Выделить всё

$_FILES = [
    'file' => [
        'name' => 'zn.xlsx'
        'type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        'tmp_name' => 'C:\\OpenServer\\OSPanel\\userdata\\php_upload\\php1B42.tmp'
        'error' => 0
        'size' => 12142
    ]
]
Временный файл в папке появляется, то есть со стороны сервера все нормально, так где собака порылась? Что за "Загрузите файл."?
бездумный копипаст приводит к безумным результатам
marsden
Сообщения: 23
Зарегистрирован: 2019.11.25, 09:28

Re: Upload не проходит валидацию

Сообщение marsden »

Изменил skipOnEmpty на true, получил Call to a member function saveAs() on null, то есть в результате валидации xlsxFile === null. Это как?

UPD. Предположил, что идет несоответствие с именем инпута, то есть в $_FILES у меня file,
а $model->imageFile = UploadedFile::getInstance($model, 'xlsxFile');
Подправил клиента, теперь

Код: Выделить всё

$_FILES = [
    'xlsxFile' => [
        'name' => 'zn.xlsx'
        'type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        'tmp_name' => 'C:\\OpenServer\\OSPanel\\userdata\\php_upload\\php17D3.tmp'
        'error' => 0
        'size' => 12142
    ]
]
но это не решило проблему. В результате вызова UploadedFile::getInstance получаю в $model->xlsxFile

Код: Выделить всё

[
    'xlsxFile' => [
        'Загрузите файл.',
    ],
]
UPD2. В итоге все заработало с UploadedFile::getInstanceByName, но я все равно не понимаю, почему не работает пример из документации...
бездумный копипаст приводит к безумным результатам
Ответить