10

Laravel 3 有一个File::mime()方法,可以很容易地从扩展名中获取文件的 mime 类型:

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

升级到 Laravel 4 时出现错误:

调用未定义的方法 Illuminate\Filesystem\Filesystem::mime()

我也看不到Filesystem API docs中提到 mime 类型。

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

4

5 回答 5

18

我发现的一种解决方案是使用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 。

于 2013-10-30T14:54:36.067 回答
7

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

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

你可以在这里看到更多!我希望它会有所帮助!:D

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

于 2013-10-30T13:59:32.430 回答
6

读完之后:

我决定将 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 库。
于 2013-10-31T14:32:22.563 回答
2

原来,SymfonyExtensionGuesserMimeTypeGuesser使用了不可靠FileInfo的类。出于这个原因,对 mime 的验证会返回不可预测的结果,并且不能以正确的方式与文件上传一起使用(它返回text/plainmimejsxlspo

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

代替

'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规则中。这行得通,但是,解决方案并不完美。

于 2014-10-10T12:26:12.957 回答
1
public function mimeType($path)
{
    return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path);
}

参考:https ://github.com/illuminate/filesystem/blob/master/Filesystem.php#L194

于 2015-08-28T13:56:35.207 回答