Laravel MIME验证

ojsjcaue  于 2023-03-19  发布在  其他
关注(0)|答案(3)|浏览(182)

我遇到了一个麻烦,关于使用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 -_-它工作了

o4hqfura

o4hqfura1#

好的。在对Laravel的源代码进行了彻底的挖掘之后,我已经弄清楚了这个系统是如何工作的。本质上,Validator从你传递的参数中分解出规则,在这个例子中,把它们发送到Validator类的validateMimes方法。这将调用一个猜测器来找出文件的扩展名。猜测器首先猜测mime-通过循环使用一系列其他猜测器来猜测mime类型,这些猜测器使用finfo PHP扩展来猜测mime类型。它将该MIME类型传递给扩展猜测器,该扩展猜测器基于以MIME类型作为键并且以扩展作为值的数组来猜测扩展。然后,它将扩展返回到Validator类中的原始调用,查看扩展是否是您首先传递给规则的“参数”数组中的值。
下面是扩展名猜测器用来根据mime-type猜测扩展名的条目。

'application/java-archive' => 'jar',
'application/java-serialized-object' => 'ser',
'application/java-vm' => 'class',
'application/javascript' => 'js',
'application/json' => 'json',
'application/jsonml+json' => 'jsonml',

正中间是javascript条目.从我收集的信息来看,我假设mime类型猜测者是猜错了.它可能把它解释为文本文件而不是javascript.尝试确保文件有正确的mime类型附加到它.
我用mime_content_type()测试了一个普通的javascript文件,它返回了text/plain,我猜这也是Laravel正在做的。
希望这有帮助!

cigdeys3

cigdeys32#

好吧,如果你在Laravel〉= 5.2上,有一个新的验证方法叫做mimetypes。所以,对于你的情况,它可以是:

'javascript_file' => 'required|mimetypes:application/javascript,text/plain',
sqxo8psd

sqxo8psd3#

我使用的是laravel 8。相关的mime和mimetypes验证(沿着其他验证)发生在

  • \供应商\laravel\框架\src\说明\验证\关注点\验证属性 *

特别是方法 validateMimesvalidateMimetypes 值得关注。是的,您的问题的原因似乎是一个错误的mime类型猜测。

相关问题