Замена для файла :: mime () в Laravel 4 (для получения типа mime из расширения файла)

У Laravel 3 был метод File :: mime (), который упростил получение типа mime файла из его расширения:

$extension = File::extension($path); $mime = File::mime($extension); 

При обновлении до Laravel 4 я получаю сообщение об ошибке:

Вызов неопределенного метода Illuminate \ Filesystem \ Filesystem :: mime ()

Я также не вижу упоминания типов mime в документах API файловой системы .

Каков рекомендуемый способ получения типа mime файла в Laravel 4 (обратите внимание, что это не загруженный пользователем файл)?

Related of "Замена для файла :: mime () в Laravel 4 (для получения типа mime из расширения файла)"

Одним из решений, которое я нашел, является использование класса Symfony HttpFoundation File (который уже включен как зависимость в Laravel 4):

 $file = new Symfony\Component\HttpFoundation\File\File($path); $mime = $file->getMimeType(); 

И на самом деле класс File использует класс Symfony MimeTypeGuesser, так что это также работает:

 $guesser = Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser::getInstance(); echo $guesser->guess($path); 

Но, к сожалению, я получаю неожиданные результаты: я получаю text / plain вместо text / css при передаче пути к css-файлу.

ЕСЛИ вы только что загрузили файл, который вы можете использовать:

 Input::file('field_name')->getMimeType(); 

Вы можете увидеть больше здесь ! Надеюсь, это поможет! : D

РЕДАКТИРОВАТЬ:
Input::file – это какое-то расширение из File , поэтому вы можете использовать File::get('file')->getMimeType(); также. Не тестировал, но ДОЛЖЕН работать.

После прочтения этого:

  • PHP mime_content_type () устарел
  • Его замена FileInfo ненадежна
  • В getMimeType () Symfony используется FileInfo (см. Мой другой ответ)

Я решил вместо этого перевести реализацию Laravel 3 в файл :: mime () в вспомогательную библиотеку в моем приложении Laravel 4. Реализация Laravel 3 просто считывает типы MIME из массива поиска config, основываясь на расширении файла.

Решение:

  • Скопированное приложение / config / mimes.php из моего проекта L3 в app / config / mimes.php в моем проекте L4
  • Создал библиотеку FileHelper с кодом функции File :: mime () из класса Laravel 3 File .

Оказалось, что Symfony ExtensionGuesser и MimeTypeGuesser используют ненадежный класс FileInfo . По этой причине проверка mimes возвращает непредсказуемые результаты и не может быть использована с загрузкой файлов соответствующим образом (она возвращает text/plain mime для js , xls , po и т. Д.).

Я нашел очень простое решение этой проблемы.

Вместо

 'attachment' => 'required|mimes:jpg,jpeg,bmp,png,doc,docx,zip,rar,pdf,rtf,xlsx,xls,txt|max:10000', 

Я разделил это на две разные части, и теперь моя проверка выглядит следующим образом:

 private function createFileAttachmentValidator($file) { return Validator::make( [ 'attachment' => $file, 'extension' => \Str::lower($file->getClientOriginalExtension()), ], [ 'attachment' => 'required|max:10000', 'extension' => 'required|in:jpg,jpeg,bmp,png,doc,docx,zip,rar,pdf,rtf,xlsx,xls,txt', ], $this->validationMessages() ); } 

Я просто пытаюсь проверить, что расширение файла присутствует и что оно указано в моем правиле. Это работает, однако, решение не идеально.

 public function mimeType($path) { return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path); } 

Ссылка: https://github.com/illuminate/filesystem/blob/master/Filesystem.php#L194