5

我遇到了一个麻烦,关于使用 Laravel 验证 JavaScript 文件的上传,验证规则是:

'javascript_file' => 'required|mimes:js'

据我所知,这应该可以工作,因为 Laravel 使用mime_content_type()来猜测文件的 mime,但它没有通过,在使用 mime 类型的文件进行测试时给我一个 mime 类型application/javascript错误

编辑: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())我得到了一个txtmime -_- 有效

4

2 回答 2

4

好的。所以在彻底挖掘了 Laravel 的源代码之后,我弄清楚了这个系统是如何工作的。本质上,Validator 从你传递的参数中分解规则,在这种情况下,将它们发送到类validateMimes上的方法Validator。这会调用猜测器来找出文件的扩展名。猜测者首先通过循环通过一堆其他猜测者来猜测 mime 类型,这些猜测者使用finfoPHP 扩展来猜测 mime 类型。一旦它有了 MIME 类型,它就会将该 MIME 类型传递给扩展猜测器,该猜测器基于一个数组猜测扩展,该数组以 MIME 类型作为键,扩展作为值。然后它将分机返回到原始呼叫中的Validator类查看扩展是否是您首先传递给规则的“参数”数组中的一个值。呸!

这是扩展猜测器用来根据 mime 类型猜测扩展的条目。

'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 类型。

我测试了一个普通的 javascript 文件使用mime_content_type()的内容,它返回了text/plain。我猜这也是 Laravel 正在做的事情。

希望这可以帮助!

于 2013-11-08T20:47:21.473 回答
0

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

'javascript_file' => 'required|mimetypes:application/javascript,text/plain',
于 2018-07-14T07:53:10.210 回答