FileValidator - не работает валидация по расширению

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

FileValidator - не работает валидация по расширению

Сообщение alexantr »

При задании в модели правила подобно этому:

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

['avatar', 'file', 'extensions' => 'jpg,jpeg,gif,png', 'maxSize' => 5242880],
валидация по расширению не работает.

Метод в yii\validators\FileValidator, отвечающий за проверку расширения, выглядит так:

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

    protected function validateExtension($file)
    {
        $extension = mb_strtolower($file->extension, 'utf-8');

        if ($this->checkExtensionByMimeType) {

            $mimeType = FileHelper::getMimeType($file->tempName);
            if ($mimeType === null) {
                return false;
            }

            $extensionsByMimeType = FileHelper::getExtensionsByMimeType($mimeType);

            if (!in_array($extension, $extensionsByMimeType, true)) {
                return false;
            }
        }

        if (!in_array($extension, $this->extensions, true)) {
            return false;
        }

        return true;
    }
 
В то время, как объект UploadedFile выглядит так:

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

object(yii\web\UploadedFile)[156]
  public 'name' => string 'common.css' (length=10)
  public 'tempName' => string 'D:\www\temp\php1A05.tmp' (length=23)
  public 'type' => string 'text/css' (length=8)
  public 'size' => int 19604
  public 'error' => int 0
В нем я не вижу св-ва extension. Есть только type.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: FileValidator - не работает валидация по расширению

Сообщение yiijeka »

Вы читали документацию?

http://www.yiiframework.com/doc-2.0/yii ... pes-detail

И вот, когда-то я писал гайд по загрузке файлов - https://github.com/yiisoft/yii2/blob/ma ... #mime-type
Аватара пользователя
alexantr
Сообщения: 9
Зарегистрирован: 2014.05.13, 09:31

Re: FileValidator - не работает валидация по расширению

Сообщение alexantr »

Извиняюсь. Разобрался.
Проблема была в другом. Я осуществлял загрузку через behavior. Нужно было перед валидацией присвоить атрибуту экземпляр UploadedFile-а.
Примерно так:

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

public function events()
{
    return [
        ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
        //...
    ];
}
public function beforeValidate($event)
{
    $this->owner->setAttribute('avatar', UploadedFile::getInstance($this->owner, 'avatar'));
}
 
longmayar
Сообщения: 55
Зарегистрирован: 2014.12.08, 16:11

Re: FileValidator - не работает валидация по расширению

Сообщение longmayar »

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

[['file'], 'file', 'checkExtensionByMimeType' => false, 'extensions' => 'mp3', 'mimeTypes' => 'audio/mp3'],
Одна мп3 проходит валидацию, другая - нет. Как это можно вылечить?
Ответить