Когда я загружаю хорошо сформированный файл 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 .