Ответ 1
Это ожидаемое поведение.
Laravel вызывает guessExtension
в Symphony UploadedFile объект, который вернет ожидаемое расширение файла, а не тип mimetype.
Вот почему документация заявляет, что для загруженного изображения вы должны использовать:
'photo' = > 'mimes: jpeg, bmp, png'
Symfony guessExtension
вызывает getMimeType
, который использует PHP Fileinfo Functions, чтобы перейти и угадать тип mimetype данного файла.
Как только getMimeType
угадывает тип mimetype для файла, Symfony MimeTypeExtensionGuesser запускает, чтобы получить расширение из типа mime, полученного из файл.
// ... cut from MimeTypeExtensionGuesser
'video/x-ms-asf' => 'asf',
'video/x-ms-wmv' => 'wmv',
'video/x-ms-wmx' => 'wmx',
'video/x-ms-wvx' => 'wvx',
'video/x-msvideo' => 'avi',
Поэтому ваши правила должны быть:
return [
'file' => ['required', 'mimes:wmv,asf']
]
Причина, по которой asf
должна быть включена, в основном историческая. Процитировать Wikipedia:
Наиболее распространенными носителями, содержащимися в файле ASF, являются Windows Media Audio (WMA) и Windows Media Video (WMV). Наиболее распространенными расширениями файлов для файлов ASF являются расширение .WMA(аудио файлы с использованием Windows Media Audio с типом MIME
audio/x-ms-wma
) и .WMV(файлы, содержащие видео, с использованием кодеков Windows Media Audio и Video, с MIME-тип 'video/x-ms-asf
'). Эти файлы идентичны старым .ASF файлам, но для их расширения и MIME-типа.
Документация Microsoft о разница между файлами ASF и WMV/WMA гласит:
Единственная разница между файлами ASF и файлами WMV или WMA - это расширения файлов и типы MIME [...] Основная внутренняя структура файлов идентична.
Поскольку внутренняя структура файла идентична (включая магические числа для формата файла), wmv, wma и asf являются тоже самое. Единственное различие между тремя расширениями - это значок, который отображается внутри Проводника.
Это не просто файлы Windows Media, которые будут иметь эту проблему, Википедические списки в разных форматах видеоконтейнеров, которые будут иметь одинаковую проблему. Если вы хотите найти видеокодек, который используется в контейнере, вам нужно будет посмотреть больше, чем просто "magic patterns" , которые используются функциями fileinfo
.
Сказанное, ожидаемое поведение!= правильное поведение.
Я отправил запрос , чтобы добавить новый валидатор под названием mimetypes
. Это делает так, как вы ожидали, и использует угаданный тип mimetype для проверки загруженного файла вместо расширения, которое угадывается из типа mimetype.