我遇到了一个麻烦,关于使用Laravel验证JavaScript文件的上传,其中验证规则是:
'javascript_file' => 'required|mimes:js'
据我所知,这应该是可行的,因为Laravel使用mime_content_type()来猜测文件的mime,但它没有通过,当使用application/javascript
mime类型的文件进行测试时,给我一个mime类型错误
编辑:dd($_FILES)
给出
["name"]=> string(7) "data.js"
["type"]=> string(22) "application/javascript"
["tmp_name"]=> string(35) "C:\easyphp\binaries\tmp\php21D0.tmp"
["error"]=> int(0)
["size"]=> int(12253)
编辑2:
正如@searsaw指出的,验证猜测似乎是错误的。
然后在validateMimes
中挖掘vendor\laravel\framework\src\Illuminate\Validation\Validator.php
方法之后
并转储猜测变量dd($value->guessExtension())
,我得到了一个txt
mime -_-它工作了
3条答案
按热度按时间o4hqfura1#
好的。在对Laravel的源代码进行了彻底的挖掘之后,我已经弄清楚了这个系统是如何工作的。本质上,Validator从你传递的参数中分解出规则,在这个例子中,把它们发送到
Validator
类的validateMimes
方法。这将调用一个猜测器来找出文件的扩展名。猜测器首先猜测mime-通过循环使用一系列其他猜测器来猜测mime类型,这些猜测器使用finfo
PHP扩展来猜测mime类型。它将该MIME类型传递给扩展猜测器,该扩展猜测器基于以MIME类型作为键并且以扩展作为值的数组来猜测扩展。然后,它将扩展返回到Validator
类中的原始调用,查看扩展是否是您首先传递给规则的“参数”数组中的值。下面是扩展名猜测器用来根据mime-type猜测扩展名的条目。
正中间是javascript条目.从我收集的信息来看,我假设mime类型猜测者是猜错了.它可能把它解释为文本文件而不是javascript.尝试确保文件有正确的mime类型附加到它.
我用
mime_content_type()
测试了一个普通的javascript文件,它返回了text/plain
,我猜这也是Laravel正在做的。希望这有帮助!
cigdeys32#
好吧,如果你在Laravel〉= 5.2上,有一个新的验证方法叫做mimetypes。所以,对于你的情况,它可以是:
sqxo8psd3#
我使用的是laravel 8。相关的mime和mimetypes验证(沿着其他验证)发生在
特别是方法 validateMimes 和 validateMimetypes 值得关注。是的,您的问题的原因似乎是一个错误的mime类型猜测。