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

1133   2  

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')

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

Другой метод-обойти валидатор и проверить mime-тип непосредственно в контроллере, используя 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

    Ничего не найдено.