表单验证中「mimetypes」和「mimes」对于 Excel 类型文件的验证是无效的?
之前一直没有用过表单验证中的mimetypes和mimes,今天第一次使用的时候,发现跟预期的不一样。
上传一个 xlsx 文件,打印出文件的
MimeType和OriginalExtension,如下图:

然后分别测试
mimetypes和mimes验证规则。
mimetypes
'file' => 'mimetypes: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
结果:
mimes
'file' => 'mimes: xlsx'
结果:
从上面的结果可以看出,传入的文件肯定是正确的类型,但是验证依旧不能通过,同样的问题在
csv类型的文件上也存在, 但是对于 图片、txt 文件等的验证是没有问题的。于是我上网搜了一下,Laravel validator and excel files error,这是stackoverflow上的一个提问,但是并没有正面回答,都是通过其他方法来实现文件类型的验证。
因此,我想确认一下文件类型的验证确实存在 bug 还是我的使用方式存在问题?
关于 LearnKu
mimetypes和mimes并不是验证的后缀,而是验证的http header中的Content-Type,所以你首先要去确定上传特定文件时,Content-Type是否是一个特定,且固定的值。按照文档给的链接来看这这样的:所以,你需要这样写:
mimes: vnd.ms-excel,vnd.openxmlformats-officedocument.spreadsheetml.sheet@zedisdog
这句话显然是不对的。
@Jeffrey 试试呗~ :innocent:
http header的说法是错的,我CSV也遇到这个问题了。
我解决的方案是这样的:
request()->file('file')->getMimeType()用这个查看类型。mimeType: "text/csv"对象是显示这个,但是getMimeType()返回的参数却是text/plain我也是,刚刚遇到这个问题
很蛋疼,打印
出现了
表单验证怎么去设置啊,
mimetypes和mimes感觉很无力啊,mimes即使你可能只需要验证指定扩展名,但此规则实际上会验证文件的 MIME 类型,其通过读取文件的内容以猜测它的 MIME 类型文档说验证扩展名,但是也会去验证MIME类型,一个
xlsx扩展名出现了zipMIME类型,怎么搞啊http header 的说法是错的 我再强调一下,以防后人被 zedisdog 误导