Валидация файлов

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
xinorbis
Сообщения: 48
Зарегистрирован: 2015.03.15, 17:20

Валидация файлов

Сообщение xinorbis »

Приветствую всех. Столкнулся с проблемой валидации dae-файлов на сервере. При аяксовой онблур проверке скрипт реагирует адекватно и пропускает только dae. Но при посте говорит "Разрешена загрузка файлов только со следующими расширениями: dae.". Понятно, что dae по сути является текстом, но если дать возможность грузить любые текстовики, то ничего хорошего из этого не выйдет. Посему прошу совета как лучше поступить в сложившейся ситуации.

Форма

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

<?php

namespace app\models\main;

use Yii;
use yii\base\Model;

class CommonForm extends Model
{
    public $modelFile;
    public $imgFile;
    protected $type;
    protected $modelPath;
    protected $imgPath;
    protected $_type;

    public static function tableName()
    {
        return 'items';
    }

    public function rules()
    {
        return [
            [['modelFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'dae'],
            [['imgFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'modelFile' => Yii::t('app', 'ModelFile'),
            'imgFile' => Yii::t('app', 'ImgFile'),
        ];
    }
}
Экшн обработки поста

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

public function actionAdd()
    {
        $view = '/admin/' . $this->viewDirectory . '/add';
        $form = $this->selectForm();

        if(Yii::$app->request->post()){
            if (Yii::$app->request->isAjax && $form->load(Yii::$app->request->post())) {
                Yii::$app->response->format = Response::FORMAT_JSON;
                return ActiveForm::validate($form);
            }

            $form->modelFile = UploadedFile::getInstance($form, 'modelFile');
            $form->imgFile = UploadedFile::getInstance($form, 'imgFile');

            if ($form->modelFile && $form->imgFile && $form->validate()) {
                $form->modelFile->saveAs('models/' . $this->viewDirectory . '/' . $form->modelFile->baseName . '.' . $form->modelFile->extension);
                $form->imgFile->saveAs('img/models/' . $this->viewDirectory . '/' . $form->imgFile->baseName . '.' . $form->imgFile->extension);

                return $this->refresh();
            } else {
                return $this->render($view, [
                    'model' => $form,
                ]);
            }
        }

        return $this->render($view, ['model' => $form]);
    }
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Валидация файлов

Сообщение astronin »

а что приходит в $_FILES ?
xinorbis
Сообщения: 48
Зарегистрирован: 2015.03.15, 17:20

Re: Валидация файлов

Сообщение xinorbis »

yii\web\UploadedFile Object
(
[name] => 4444444444444_2x2x2.DAE
[tempName] => C:\OpenServer\userdata\temp\php4254.tmp
[type] => application/octet-stream
[size] => 17717
[error] => 0
)

Вот только одно непонятно. Почему-то FileHelper::getMimeType($form->modelFile->tempName, null, false); выводит image/png
xinorbis
Сообщения: 48
Зарегистрирован: 2015.03.15, 17:20

Re: Валидация файлов

Сообщение xinorbis »

Такс... Прошу прощения, оказалось, что часть имеющихся моделей - это png переобозванные в dae. Нормальные модели FileHelper::getMimeType() определяет как xml.
xinorbis
Сообщения: 48
Зарегистрирован: 2015.03.15, 17:20

Re: Валидация файлов

Сообщение xinorbis »

Решил через отдельный метод. Похоже, что только через настройки rules такое решить нельзя.

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

public function rules()
    {
        return [
            [['modelFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'dae', 'checkExtensionByMimeType' => false],
            [['imgFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png'],
            ['modelFile', 'validateModelFile'],
        ];
    }
 
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Валидация файлов

Сообщение astronin »

xml потому что mimetype у него такой "model/vnd.collada+xml"
походу проблемы с файлами какие-то...
Ответить