Проверка загрузки файла 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 для объявления формы)

редактировать

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

Я, наконец, использовал класс MimeReader пользователем Shane , который полностью работает. Мне все еще интересно, почему так сложно обнаружить правильный тип мим.

Я реализовал его как валидатор в Laravel:

  • Переместить MimeReader.phps в app/libraries/MimeReader.php (смотреть расширение)
  • Расширьте Validator Laravel (я положил его в свой конструктор 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 как правило! Пример: 'file' => 'required|audio' , где file относится к Input::file('file')

Laravel рассматривал файлы audio/mpeg как .mpga а не .mp3 . Я исправил его в MimeTypeExtensionGuesser.php (в библиотеке Symfony), а также audio/ogg , которые считались .oga . Возможно, тип аудио mime зависит от того, какой программный кодер использовался.

Другой метод – обходить валидатор и проверять тип mime непосредственно в контроллере, используя Input::file('upload')->getMimeType() как сказал шейх Хера.

Вероятно, из-за того, что тип mime файла mp3 – это audio/mpeg или может быть так, он не может распознать mime_content_type и сообщает application/octet-stream как общий / резервный тип. Вы можете попробовать это правило (пример ниже) вместо (не проверено / уверенно), потому что audio/mpeg – правильный тип mime для mp3 соответствии с rfc3003 :

 array('trackfile' => 'required|mimes:audio/mpeg,mp3') 

Кроме того, вы можете вручную проверить тип mmie используя что-то вроде этого:

 $file = Input::file('upload'); if($file->getMimeType() == 'audio/mpeg') { // valid } else { // invalid } 

Обновить:

Специально для mp3 файлов вы также можете использовать библиотеку getID3, которая похожа на расширение Php PECL 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 .