Laravel 5 Mime验证

时间:2015-04-24 08:41:05

标签: laravel laravel-5

好的,我正在尝试上传视频,并验证文件类型。

根据文件:

  

默剧:FOO,酒吧,...

     

正在验证的文件必须具有与列出的扩展名之一相对应的MIME类型。

     

MIME规则的基本用法

     

'相片' => '默剧:JPEG,BMP,PNG'

我上传了一个wmv视频,我的规则就是这样:

return [
    'file' => ['required', 'mimes:video/x-ms-wmv']
]

我在print_r()上完成了Request::file('file'),我收到了以下数据:

Symfony\Component\HttpFoundation\File\UploadedFile Object
(
    [test:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 
    [originalName:Symfony\Component\HttpFoundation\File\UploadedFile:private] => SampleVideo.wmv
    [mimeType:Symfony\Component\HttpFoundation\File\UploadedFile:private] => video/x-ms-wmv
    [size:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 70982901
    [error:Symfony\Component\HttpFoundation\File\UploadedFile:private] => 0
    [pathName:SplFileInfo:private] => C:\wamp\tmp\php6428.tmp
    [fileName:SplFileInfo:private] => php6428.tmp
)

但是我收到了错误:

{"file":["The file must be a file of type: video\/x-ms-wmv."]}

我试过更改" mime类型"到video/*wmv(根据文档)以及video/x-ms-wmv,但它们都没有正确验证文件。

正如您从print_r()可以看到,Symfony的mime类型 video/x-ms-wmv

我做错了吗?或者Laravel / Symfony能不能很好地验证文件?

我很感激帮助

修改 好的,我打开validator.php并将echo $value->guessExtension();添加到ValidateMimes()方法,然后输出asf。

为什么Symfony输出video\x-ms-wmv,文件扩展名是wmv,我验证了这两个,但是Laravel正在猜测asf?!

对我来说,视频验证太不可靠了。

1 个答案:

答案 0 :(得分:18)

这是预期的行为。

Laravel is在Symphony的UploadedFile对象上调用guessExtension,该对象将返回文件的预期扩展名,而不是mimetype。

这就是为什么文档说明对于上传的图像你应该使用:

  

'相片' => '默剧:JPEG,BMP,PNG'

Symfony的guessExtension来电getMimeType,它使用PHP的Fileinfo Functions来猜测给定文件的mimetype。

一旦getMimeType猜出文件的mimetype,Symfony的MimeTypeExtensionGuesser就会从文件中检索到的mime类型中获取扩展名。

    // ... cut from MimeTypeExtensionGuesser
    'video/x-ms-asf' => 'asf',
    'video/x-ms-wmv' => 'wmv',
    'video/x-ms-wmx' => 'wmx',
    'video/x-ms-wvx' => 'wvx',
    'video/x-msvideo' => 'avi',

因此,您的规则应该是:

return [
    'file' => ['required', 'mimes:wmv,asf']
]

应该包括asf的原因主要是历史性的。引用维基百科:

  

ASF文件中包含的最常见媒体是Windows Media Audio(WMA)和Windows Media Video(WMV)。 ASF文件最常见的文件扩展名是扩展名.WMA(使用Windows Media Audio的纯音频文件,MIME类型' audio/x-ms-wma')和.WMV(包含视频的文件,使用Windows Media音频和视频编解码器,MIME类型' video/x-ms-asf')。这些文件与旧的.ASF文件相同,但是对于它们的扩展名和MIME类型。

关于the difference between ASF and WMV/WMA files州的

Microsoft文档

  

ASF文件与WMV或WMA文件之间的唯一区别是文件扩展名和MIME类型[...]文件的基本内部结构是相同的。

由于文件的内部结构相同(包括文件格式的 magic numbers ),因此wmv,wma和asf是同一个。三个扩展名之间的唯一区别是Explorer中显示的图标。

这不仅仅是会出现此问题的Windows Media文件,Wikipedia lists许多不同的视频容器格式会出现同样的问题。如果您要查找容器中使用的视频编解码器,则需要查看更多内容fileinfo使用的"magic patterns"功能

话虽如此,预期行为!= 正确行为

我提交了pull request来添加一个名为mimetypes的新验证程序。这可以按照您的预期进行,并使用猜测的mimetype来验证上传的文件,而不是从mimetype中猜到的扩展名。