表单验证中「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 还是我的使用方式存在问题?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前 评论

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