gpt4 book ai didi

Laravel 5 Mime 验证

转载 作者:行者123 更新时间:2023-12-02 09:56:03 25 4
gpt4 key购买 nike

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

根据文档:

mimes:foo,bar,...

The file under validation must have a MIME type corresponding to one of the listed extensions.

Basic Usage Of MIME Rule

'photo' => 'mimes: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 ?!

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

最佳答案

这是预期的行为。

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

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

'photo' => 'mimes: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 的原因主要是历史原因。引用维基百科:

The most common media contained within an ASF file are Windows Media Audio (WMA) and Windows Media Video (WMV). The most common file extensions for ASF files are extension .WMA (audio-only files using Windows Media Audio, with MIME-type 'audio/x-ms-wma') and .WMV (files containing video, using the Windows Media Audio and Video codecs, with MIME-type 'video/x-ms-asf'). These files are identical to the old .ASF files but for their extension and MIME-type.

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

The only difference between ASF files and WMV or WMA files are the file extensions and the MIME types [...] The basic internal structure of the files is identical.

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

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

<小时/>

话虽这么说,预期行为!=正确行为

我提交了pull request添加一个名为 mimetypes 的新验证器。这正如您所期望的那样,并使用猜测的 mimetype 来验证上传的文件,而不是根据 mimetype 猜测的扩展名。

关于Laravel 5 Mime 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29842625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com