Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 5 Mime验证_Laravel_Laravel 5 - Fatal编程技术网

Laravel 5 Mime验证

Laravel 5 Mime验证,laravel,laravel-5,Laravel,Laravel 5,好的,我正在上传一个视频,并验证文件类型 根据文件: 模仿:foo,bar,… 验证中的文件必须具有与列出的扩展名之一对应的MIME类型 MIME规则的基本用法 'photo'=>'mimes:jpeg、bmp、png' 我正在上传wmv视频,我的规则是: return [ 'file' => ['required', 'mimes:video/x-ms-wmv'] ] 我已经在Request::file('file')上执行了print\r(),得到了以下数据: Symfony

好的,我正在上传一个视频,并验证文件类型

根据文件:

模仿:foo,bar,…

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

MIME规则的基本用法

'photo'=>'mimes:jpeg、bmp、png'

我正在上传wmv视频,我的规则是:

return [
    'file' => ['required', 'mimes:video/x-ms-wmv']
]
我已经在
Request::file('file')
上执行了
print\r()
,得到了以下数据:

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\u r()
中可以看到,mime类型Symfony越来越
video/x-ms-wmv

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

我感谢你的帮助

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

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


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

这是预期行为

调用Symphony的UploadedFile对象,该对象将返回文件的预期扩展名,而不是mimetype

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

'photo'=>'mimes:jpeg、bmp、png'

Symfony的
guessExtension
调用
getMimeType
,它使用PHP去猜测给定文件的mimetype

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

/。。。从MimeTypeExtensionGuesser中剪切
“视频/x-ms-asf'=>“asf”,
“视频/x-ms-wmv”=>“wmv”,
'视频/x-ms-wmx'=>'wmx',
“视频/x-ms-wvx”=>“wvx”,
'video/x-msvideo'=>'avi',
因此,您的规则应该是:

返回[
'文件'=>['必需','模拟: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类型不同

Microsoft关于州的文档:

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

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

不仅仅是Windows Media文件会有这个问题,许多不同的视频容器格式也会有同样的问题。如果要查找容器中正在使用的视频编解码器,您需要查看的不仅仅是
fileinfo
函数所使用的


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


我提交了一个新的验证程序,名为
mimetypes
。这与您预期的一样,并使用猜测的mimetype来验证上载的文件,而不是从mimetype猜测的扩展名。

我也有这个问题,问题是我使用的PHP版本,请尝试创建一个普通PHP文件,并使用Fileinfo函数检查视频的mime类型感谢您的解释,你知道我是不是运气不好选择了一种“困难”的文件类型(wmv/asf),还是其他很多文件类型都会出现这种情况(也就是说,我希望它是mp4,但它“猜测”了另一个扩展名,例如)?@PhilCross,主要是wmv/asf有这个问题。mp4已经经历了一个更好的标准化过程:)(虽然,您仍然可能会遇到.mpv文件被标记为mp4等的问题,但这是意料之中的-即,您希望
jpeg
文件被标记为
jpg
,等等)。
wmv
的问题在于它是一种容器格式,就像
mkv
一样,因此,仅仅因为它的结尾有“.wmv”,并不意味着它实际使用的是
Windows Media Video
格式。感谢您的另一个解释!我将+1答案:)Laravel中的字体如何?我对字体使用请求验证,但它不起作用
'fontwoff2colum'=>'mimes:woff2'
@FaridVatani模拟类型应为
application/font-woff
。看见