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

根据文档:


哑剧:foo,bar,...

验证中的文件必须具有与列出的扩展名之一相对应的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获得的哑剧类型是video/x-ms-wmv

难道我做错了什么?还是Laravel / Symfony不能很好地验证文件?

感谢您的帮助

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

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

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

最佳答案

这是预期的行为。

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

这就是为什么documenatation指出对于上传的图像,您应该使用:


'照片'=>'哑剧:jpeg,bmp,png'


Symfony的guessExtension调用getMimeType,它使用PHP的Fileinfo Functions来猜测给定文件的模仿类型。

一旦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 Audio和Video编解码器的包含视频的文件,带有MIME类型'video/x-ms-asf')。这些文件与旧的.ASF文件相同,但扩展名和MIME类型相同。


Microsoft关于the difference between ASF and WMV/WMA files的文档指出:


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


因为文件的内部结构是相同的(包括文件格式的magic numbers),所以wmv,wma和asf是相同的。这三个扩展之间的唯一区别是资源管理器中显示的图标。

不仅Windows Media文件会出现此问题,Wikipedia lists许多不同的视频容器格式也会出现此问题。如果要查找容器中正在使用的视频编解码器,则需要查看的内容多于fileinfo函数使用的"magic patterns"



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

我提交了pull request来添加一个名为mimetypes的新验证器。这会按照您的预期进行,并使用猜测的mimetype验证上传的文件,而不是根据mimetype猜测的扩展名。

10-08 16:58