У Laravel 3 был метод File :: mime (), который упростил получение типа mime файла из его расширения:
$extension = File::extension($path); $mime = File::mime($extension);
При обновлении до Laravel 4 я получаю сообщение об ошибке:
Вызов неопределенного метода Illuminate \ Filesystem \ Filesystem :: mime ()
Я также не вижу упоминания типов mime в документах API файловой системы .
Каков рекомендуемый способ получения типа mime файла в Laravel 4 (обратите внимание, что это не загруженный пользователем файл)?
Одним из решений, которое я нашел, является использование класса 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();
также. Не тестировал, но ДОЛЖЕН работать.
После прочтения этого:
Я решил вместо этого перевести реализацию Laravel 3 в файл :: mime () в вспомогательную библиотеку в моем приложении Laravel 4. Реализация Laravel 3 просто считывает типы MIME из массива поиска config, основываясь на расширении файла.
Решение:
Оказалось, что 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