Почему некоторые файлы не проходят валидацию при загрузке на сервер, и почему при этом не выдаётся ошибка?

Система: Yii2, Windows 10.

Правило валидации загрузки аудио файлов:

public function rules()
{
    return [
        [['audioFile'], 'file', 'extensions' => 'mp3, m4a', 'skipOnEmpty' => false],
    ];
}

public function upload()
{
    if ($this->validate()) {
        $this->audioFile->saveAs('m_upload/audio/' . $this->audioFile->baseName . '.' . $this->audioFile->extension);
        return true;
    } else {
        return false;
    }
}

Заметил, что некоторые mp3 - файлы проходят валидацию и загружаются на сервер, а некоторые не проходят. Во втором случае ошибку в форме я не получаю, страница просто перезагружается.

Поскольку удаление параметра проверки extensions проблему "незагрузки" файлов на сервер снимало, прихожу к выводу, что причина так или иначе связана с конкретными mp3-файлами и/или проверкой на них.

Как таковая валидация работает, при установке в extensions произвольного значения, например, aaamp3, уведомление о несоответствующем формате файла форма выдаёт.

Допустим, файлы как-то повреждены и не проходят валидацию (хотя их корректно обрабатывает аудиоплеер), но почему не выдается ошибка тогда? Кто-то может подсказать, в чем причина такого поведения?


Ответы (1 шт):

Автор решения: Andrew Hobbit

По умолчанию, при загрузке файла идет проверка соответствия расширения файла, его MIME типу (вроде как exe переименовали в doc и загружают) в файле /validators/FileValidator.php

/**
 * @var bool whether to check file type (extension) with mime-type. If extension produced by
 * file mime-type check differs from uploaded file extension, the file will be considered as invalid.
 */
public $checkExtensionByMimeType = true;

Можно проверку отключить и указать допустимые MIME типы:

 public function rules()
{
    return [
        [['audioFile'], 'file', 'checkExtensionByMimeType' => false, 'extensions' => 'mp3, m4a', 'mimeTypes' => 'audio/*', 'skipOnEmpty' => false],
    ];
}
→ Ссылка