Проверка MIME-типа загрузки файлов с помощью Laravel 4
Когда я загружаю хорошо сформированный MP3-файл, Laravel 4 говорит мне, что это не audio/mp3, а application/octet-stream, что делает эту проверку неудачной:
$validator = Validator::make(
array('trackfile' => Input::file('trackfile')),
array('trackfile' => 'required|mimes:mp3')
);
if($validator->fails())
return 'doesn't works because mime type is '.Input::file('trackfile')->getMimeType();
else
return 'it works!';
Почему он не загружает файл в виде файла audio/mp3?
(я уже добавил 'files' => true к объявлению формы)
2 ответов:
Edit
Встроенный валидатор все еще рассматривал некоторые mp3 как приложение / октет-поток, независимо от того, конвертировали ли вы исходный файл с помощью того или иного программного обеспечения.
Я, наконец, использовал класс MimeReader от пользователя Shane, который полностью работает. Я все еще удивляюсь, почему так трудно обнаружить правильный тип мима.
Я реализовал его в качестве валидатора в Laravel:
- переместить
MimeReader.phpsвapp/libraries/MimeReader.php(Смотреть расширение)Расширить Laravel
Validator(я положил его в мойBaseControllerконструктор)Validator::extend('audio', function($attribute, $value, $parameters) { $allowed = array('audio/mpeg', 'application/ogg', 'audio/wave', 'audio/aiff'); $mime = new MimeReader($value->getRealPath()); return in_array($mime->get_type(), $allowed); });- добавьте сообщение об ошибке в
app/lang/[whatever]/validation.php(в моем случае ключaudio)- теперь я могу использовать
audioкак правило ! Пример:'file' => 'required|audio', гдеfileотносится кInput::file('file')
Ларавель рассматривал файлы
Другой метод-обойти валидатор и проверить mime-тип непосредственно в контроллере, используяaudio/mpegкак.mpga, а не.mp3. Я исправил его вMimeTypeExtensionGuesser.php(в библиотеке Symfony), вместе сaudio/ogg, которые рассматривались как.oga. Может быть, аудио-мим-тип зависит от какой программный кодер был использован.Input::file('upload')->getMimeType(), как сказал шейх Хира.
Это, вероятно, из-за
mp3типа mime файлаaudio/mpegили может быть так, что он не распознаетmime_content_typeи сообщаетapplication/octet-streamкак универсальный/резервный тип. Вы можете попробовать это правило (пример приведен ниже) вместо этого (не проверено / уверен), потому чтоaudio/mpegявляется правильным типом mime дляmp3в соответствии с rfc3003 :array('trackfile' => 'required|mimes:audio/mpeg,mp3')Кроме того, вы можете вручную проверить тип
mime, используя что-то вроде этого:$file = Input::file('upload'); if($file->getMimeType() == 'audio/mpeg') { // valid } else { // invalid }Обновление:
Специально для файлов
mp3вы можете также используйте библиотеку getID3 , которая похожа на PHP PECL extension id3 , если вы используете ее, вы также сможете использоватьID3 tagфайла и можете получить такую информацию, какtitle,artist,album,year,genreи т.д.Если вы используете его, вы должны загрузить его вручную из данной ссылки (
getid3) и поместить его в папку внутриapp, возможноapp/libs/и просто поместить папкуgetid3из извлеченного источника в папкуlibs, а затем в вашем файлеcomposer.jsonдобавить запись внутриclassmapизautoloadраздела типа:// ... "app/tests/TestCase.php", "app/libs/getid3"Затем запустите
composer dump-autoloadиз терминала/командной строки, и вы готовы использовать его. Чтобы использовать его наглядно попробуйте следующее:$file = Input::file('upload'); // assumed name of the file input is upload $path = $path = $file->getRealPath(); $id3 = new getID3(); $tags = $id3->analyze($path); if(is_array($tags) && array_key_exists('audio', $tags)) { // valid dd($tag['tags']); }Для допустимого файла
mp3вы получите такой массив:array (size=2) 'id3v1' => array (size=6) 'title' => array (size=1) 0 => string '46. Piya Basanti' (length=16) 'artist' => array (size=1) 0 => string '(Freshmaza.com)' (length=15) 'album' => ...Если вы уже установили или можете установить расширение
PECL, используя (из терминала) следующую команду:pear install pecl/id3Тогда вы можете нормально использовать
$tags = id3_get_tag( "path/to/example.mp3" ); print_r($tag);Приведенный выше пример выведет нечто подобное:
Array ( [title] => DN-38416 [artist] => Re:\Legion [album] => Reflections [year] => 2004 [genre] => 19 )Проверка PHP manual .
Comments