[英]Replacement for File::mime() in Laravel 4 (to get mime type from file extension)
Laravel 3有一個File :: mime()方法,可以很容易地從其擴展名中獲取文件的mime類型:
$extension = File::extension($path);
$mime = File::mime($extension);
升級到Laravel 4時出現錯誤:
調用未定義的方法Illuminate \\ Filesystem \\ Filesystem :: mime()
我也看不到在Filesystem API文檔中提到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);
但不幸的是,我得到了意想不到的結果:在將路徑傳遞給css文件時,我得到text / plain而不是text / css 。
如果您剛剛上傳了該文件,則可以使用:
Input::file('field_name')->getMimeType();
你可以在這里看到更多! 我希望能得到一些幫助! :d
編輯:
Input::file
是File
某種擴展,所以你可以使用File::get('file')->getMimeType();
也。 沒有測試,但必須工作。
看完之后:
我決定將Laravel 3的File :: mime()實現移植到我的Laravel 4應用程序中的幫助庫中。 Laravel 3實現只是根據文件擴展名從配置查找數組中讀取MIME類型。
解:
事實證明,Symfony ExtensionGuesser
和MimeTypeGuesser
使用不可靠的FileInfo
類。 因此,mimes的驗證會返回不可預測的結果,並且不能以正確的方式用於文件上傳(它返回js
, xls
, po
等的text/plain
mime)。
我找到了解決這個問題的非常簡單的方法。
代替
'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()
);
}
我只是嘗試驗證文件的擴展名是否存在,以及它是否在我in
規則中列出。 然而,這是有效的,解決方案並不完美。
public function mimeType($path)
{
return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path);
}
參考: https : //github.com/illuminate/filesystem/blob/master/Filesystem.php#L194
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.