Phi*_*oss 17 laravel laravel-5
好的,我正在尝试上传视频,并验证文件类型.
根据文件:
默剧:FOO,酒吧,...
验证中的文件必须具有与列出的扩展名之一相对应的MIME类型.
MIME规则的基本用法
'photo'=>'mimes:jpeg,bmp,png'
我正在上传一个wmv视频,我的规则是这样的:
return [
'file' => ['required', 'mimes:video/x-ms-wmv']
]
Run Code Online (Sandbox Code Playgroud)
我已经做了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
)
Run Code Online (Sandbox Code Playgroud)
但是我收到错误:
{"file":["The file must be a file of type: video\/x-ms-wmv."]}
Run Code Online (Sandbox Code Playgroud)
我试图改变"MIME类型"来video/*,wmv(按照文档),也video/x-ms-wmv还没有一个正确的验证文件.
正如你可以从看到print_r()MIME类型的Symfony越来越是 video/x-ms-wmv.
难道我做错了什么?或者Laravel/Symfony不能很好地验证文件?
我很感激帮助
编辑
确定,我打开validator.php并添加echo $value->guessExtension();到ValidateMimes()方法中,然后输出asf.
为什么Symfony输出video\x-ms-wmv,文件扩展名为wmv,我正在验证它们两个,但是Laravel正在猜测asf?!
对我来说,视频验证太不可靠了.
Tim*_*eld 19
这是预期的行为.
Laravel正在调用guessExtensionSymphony的UploadedFile对象,该对象将返回文件的预期扩展名,而不是mimetype.
这就是为什么文档说明对于上传的图像你应该使用:
'photo'=>'mimes:jpeg,bmp,png'
Symfony的guessExtension调用getMimeType,它使用PHP的Fileinfo函数去猜测给定文件的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',
Run Code Online (Sandbox Code Playgroud)
因此,您的规则应该是:
return [
'file' => ['required', 'mimes:wmv,asf']
]
Run Code Online (Sandbox Code Playgroud)
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类型.
Microsoft关于ASF和WMV/WMA文件之间差异的文档说明:
ASF文件与WMV或WMA文件之间的唯一区别是文件扩展名和MIME类型[...]文件的基本内部结构是相同的.
由于文件的内部结构相同(包括文件格式的幻数),因此wmv,wma和asf是同一个.三个扩展之间的唯一区别是Explorer中显示的图标.
不仅仅是Windows Media文件会出现这个问题,维基百科列出了许多不同的视频容器格式,这些格式也存在同样的问题.如果要查找容器中使用的视频编解码器,则需要查看更多信息,然后再查看函数使用的" 魔术模式 "fileinfo.
话虽如此,预期的行为!= 正确的行为.
我提交了一个pull请求来添加一个名为的新验证器mimetypes.这正如您所期望的那样,并使用猜测的mimetype来验证上传的文件,而不是从mimetype猜测的扩展名.
| 归档时间: |
|
| 查看次数: |
14701 次 |
| 最近记录: |