表单验证中「mimetypes」和「mimes」对于 Excel 类型文件的验证是无效的?

之前一直没有用过表单验证中的mimetypesmimes,今天第一次使用的时候,发现跟预期的不一样。

上传一个 xlsx 文件,打印出文件的 MimeTypeOriginalExtension,如下图:

file

然后分别测试 mimetypesmimes验证规则。

mimetypes

'file' => 'mimetypes:  application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

结果:
file

mimes

 'file' => 'mimes: xlsx'

结果:
file

从上面的结果可以看出,传入的文件肯定是正确的类型,但是验证依旧不能通过,同样的问题在 csv 类型的文件上也存在, 但是对于 图片、txt 文件等的验证是没有问题的。于是我上网搜了一下,Laravel validator and excel files error,这是 stackoverflow 上的一个提问,但是并没有正面回答,都是通过其他方法来实现文件类型的验证。

因此,我想确认一下文件类型的验证确实存在 bug 还是我的使用方式存在问题?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

mimetypesmimes 并不是验证的后缀,而是验证的 http header 中的 Content-Type ,所以你首先要去确定上传特定文件时,Content-Type 是否是一个特定,且固定的值。按照文档给的链接来看这这样的:

file

file

所以,你需要这样写:mimes: vnd.ms-excel,vnd.openxmlformats-officedocument.spreadsheetml.sheet

5年前 评论

@zedisdog

mimetypesmimes 并不是验证的后缀,而是验证的 http header 中的 Content-Type

这句话显然是不对的。

5年前 评论

http header的说法是错的,我CSV也遇到这个问题了。

我解决的方案是这样的:

request()->file('file')->getMimeType()用这个查看类型。

mimeType: "text/csv"对象是显示这个,但是getMimeType()返回的参数却是text/plain

4年前 评论
月光

我也是,刚刚遇到这个问题

4年前 评论
vance

很蛋疼,打印

dd([$file->getMimeType(),$file->getClientMimeType(),$file->getClientOriginalExtension()]);

出现了

array:3 [
  0 => "application/zip"
  1 => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
  2 => "xlsx"
]

表单验证怎么去设置啊,mimetypesmimes感觉很无力啊,
mimes即使你可能只需要验证指定扩展名,但此规则实际上会验证文件的 MIME 类型,其通过读取文件的内容以猜测它的 MIME 类型
文档说验证扩展名,但是也会去验证MIME类型,一个xlsx扩展名出现了zipMIME类型,怎么搞啊

4年前 评论

http header 的说法是错的 我再强调一下,以防后人被 zedisdog 误导

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!