替换 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()

我在文件系统 API 文档中也没有看到任何提及 mime 类型的内容。

在Laravel 4中获取文件的MIME类型的推荐方法是什么(请注意,这不是用户上传的文件)?

我找到的一个解决方案是使用Symfony HttpFoundation文件类(它已经作为依赖项包含在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 文件时,我得到的是文本/纯文本而不是文本/css

如果您刚刚上传了文件,则可以使用:

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

你可以在这里看到更多!我希望能得到一些帮助!:D

编辑:
Input::fileFile的某种扩展,所以你也可以使用File::get('file')->getMimeType();。没有测试,但必须工作。

读完之后:

  • PHP mime_content_type() 已弃用
  • 它的替换文件信息是不可靠的
  • Symfony的getMimeType()使用FileInfo(见我的另一个答案)

我决定将 Laravel 3 的 File::mime() 实现移植到我的 Laravel 4 应用程序中的辅助库中。Laravel 3 实现只是根据文件扩展名从配置查找数组中读取 MIME 类型。

溶液:

  • 应用程序/配置/mimes.php从我的L3项目复制到我的L4项目中的应用程序/配置/mimes.php
  • 使用来自Laravel 3 File类的File::mime()函数代码创建了一个FileHelper库。

事实证明,Symfony ExtensionGuesserMimeTypeGuesser使用不可靠的FileInfo类。因此,mime 的验证会返回不可预测的结果,并且不能以正确的方式与文件上传一起使用(它返回text/plain mime 用于jsxlspo等)。

我为这个问题找到了非常简单的解决方案。

而不是

'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