我遇到了一个麻烦,关于使用 Laravel 验证 JavaScript 文件的上传,
其中验证规则是:
'javascript_file' => 'required|mimes:js'
据我所知,这应该有效,因为 Laravel 使用mime_content_type() https://www.php.net/mime_content_type猜测文件的 mime,但它没有通过,在使用文件进行测试时给我一个 mime 类型错误application/javascript
默剧类型
Edit: dd($_FILES)
gives
["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)
Edit 2:
正如@searsaw 指出的,似乎验证猜测是错误的。
深入挖掘后validateMimes
中的方法vendor\laravel\framework\src\Illuminate\Validation\Validator.php
并转储猜测变量dd($value->guessExtension())
我有一个txt
哑剧-_- 有效
好的。因此,在彻底挖掘了 Laravel 的源代码之后,我已经弄清楚了这个系统是如何工作的。本质上,验证器根据您传递的参数分解规则,并在本例中将它们发送到validateMimes
方法上的Validator
班级。这会调用猜测器来找出文件的扩展名。猜测者首先通过循环使用一堆其他猜测者来猜测哑剧类型,这些猜测者使用finfo
用于猜测 mime 类型的 PHP 扩展。一旦获得 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 条目。根据我收集到的信息,我假设哑剧类型的猜测者猜测错误。它可能会将其解释为文本文件而不是 JavaScript。尝试确保该文件附加了正确的 mime 类型。
我测试了一个普通的 javascript 文件使用时出现的情况mime_content_type()
,它返回了text/plain
。我猜 Laravel 也是这么做的。
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)