Почему некоторые файлы не проходят валидацию при загрузке на сервер, и почему при этом не выдаётся ошибка?
Система: 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 шт):
По умолчанию, при загрузке файла идет проверка соответствия расширения файла, его 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],
];
}