【问题标题】:Laravel MIME ValidationLaravel MIME 验证
【发布时间】:2013-11-19 21:51:28
【问题描述】:

我遇到了一个麻烦,关于使用 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 指出的那样,验证猜测似乎是错误的。

vendor\laravel\framework\src\Illuminate\Validation\Validator.php中挖掘validateMimes方法后

并转储猜测变量dd($value->guessExtension()) 我得到了一个txt mime -_- 有效

【问题讨论】:

  • 尝试使用类似的东西; 'required|mimes:js,javascript'
  • 已经尝试过javascriptapplication/javascript 但没有任何改变

标签: php laravel


【解决方案1】:

好的。所以在彻底挖掘了 Laravel 的源代码之后,我弄清楚了这个系统是如何工作的。从本质上讲,Validator 从您传递的参数中分解规则,在这种情况下,将它们发送到 Validator 类的 validateMimes 方法。这会调用猜测器来找出文件的扩展名。猜测者首先通过循环通过一堆其他猜测者来猜测 mime 类型,这些猜测者使用finfo PHP 扩展来猜测 mime 类型。一旦它有了 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 正在做的事情。

希望这会有所帮助!

【讨论】:

  • 尝试'data' => 'required|mimes:js,javascript,plain,text/plain',dd($_FILES) 没有用,给我application/javascript 作为文件的mime
  • 正如你所指出的,猜测者似乎猜错了,并将“txt”作为哑剧-_-
  • 嗯,它会寻找扩展。所以使用像mimes:txt 这样的东西可能会起作用。
  • 是的,这就是我所做的,但是为mime:txt.js 似乎违反直觉
  • 我同意。你可能想在 Laravel Github 中提交错误报告。有人可能会找出如何让它正常工作。至少现在你问题出在哪里。
【解决方案2】:

好吧,如果您使用的是 >= 5.2 的 Laravel,那么有一种称为 mimetypes 的新验证方法。因此,对于您的情况,可能是:

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

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 2016-06-12
    • 1970-01-01
    • 2016-08-16
    • 2016-08-05
    • 2017-03-07
    • 1970-01-01
    • 2023-03-19
    • 2017-06-23
    相关资源
    最近更新 更多