簡體   English   中英

在Laravel 4中替換File :: mime()(從文件擴展名獲取mime類型)

[英]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::fileFile某種擴展,所以你可以使用File::get('file')->getMimeType(); 也。 沒有測試,但必須工作。

看完之后:

我決定將Laravel 3的File :: mime()實現移植到我的Laravel 4應用程序中的幫助庫中。 Laravel 3實現只是根據文件擴展名從配置查找數組中讀取MIME類型。

解:

  • 將我的L3項目中的application / config / mimes.php復制到我的L4項目中的app / config / mimes.php
  • 使用Laravel 3 File類中的File :: mime()函數代碼創建了一個FileHelper庫。

事實證明,Symfony ExtensionGuesserMimeTypeGuesser使用不可靠的FileInfo類。 因此,mimes的驗證會返回不可預測的結果,並且不能以正確的方式用於文件上傳(它返回jsxlspo等的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM