上传 SVG 文件时"Content-Type not allowed",该文件位于允许的白名单中



重要说明:以下问题已在 Struts 版本 2.3.24 中修复

从那个版本开始,就没有必要转义任何角色。

阅读更多:JIRA问题WW-4457。

<小时 />

我已经将 Struts2 文件上传拦截器配置为允许内容类型的白名单。

这适用于与指定的内容类型匹配的任何文件,但不适用于具有 MIME 媒体类型 image/svg+xmlSVG文件

使用此配置:

@Action(value = "upload", 
    interceptorRefs = @InterceptorRef( 
        value = "defaultStack",
        params = { "fileUpload.allowedTypes" , "application/pdf,"
                                             + "image/jpeg,"
                                             + "image/gif,"
                                             + "image/png,"
                                             + "image/svg+xml"
                  }))

并上传有效的 SVG 文件,我收到由 struts.messages.error.content.type.not.allowed 属性定义的错误消息:

不允许的内容类型:{0}"{1}"{2}"{3}

其中{3}是用户尝试上传的内容类型;

然后例如:

不允许的内容类型:myFile "Sample.svg" "upload__123__456__78.tmp" image/svg+xml

这与allowedTypes白名单中定义的内容类型完全相同。

请注意,我使用 regex 模式匹配器,在支柱中使用以下常量启用.xml :

<constant name="struts.patternMatcher"  value="regex" />

为什么它不起作用,以及如何使其工作?

fileUpload侦听器使用 PatternMatcher 来检查允许的 MIME 类型。默认情况下,S2 使用WildcardHelper模式匹配器,该匹配器将与 image/svg+xml 一起使用。

通过将默认模式匹配器更改为regexfileUpload拦截器开始使用正则表达式检查允许的类型。+是正则表达式中的一个特殊字符,因此必须像image/svg\+xml那样对其进行转义才能工作。

注意:在这种情况下,更改默认模式匹配器会引入意外行为,可能应报告为错误。

MIME 中的+符号是罪魁祸首。

以某种方式被保留,因此需要被转义;由于使用约定插件,它位于字符串内,因此转义反斜杠也需要转义。

使用image/svg\+xml就像一个魅力:

params = { "fileUpload.allowedTypes" ,    "application/pdf,"
                                        + "image/jpeg,"
                                        + "image/gif,"
                                        + "image/png,"
                                        + "image/svg\+xml"

我不确定基于 XML 的标准配置是否需要这样做。

最新更新