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

"Content-Type not allowed" while uploading an SVG file, that is in the allowed whitelist

IMPORTANT: The following problem has been fixed in Struts version 2.3.24.

From that version on, there is no need to escape any character.

Read more: JIRA Issue WW-4457.


我已经配置 Struts2 FileUpload 拦截器以允许内容类型的白名单。

这适用于与指定内容类型匹配的任何文件,但它不适用于 SVG 个文件have MIME media type image/svg+xml

使用此配置:

@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 属性:

定义的错误消息

Content-Type not allowed: {0} "{1}" "{2}" {3}

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

然后例如:

Content-Type not allowed: myFile "Sample.svg" "upload__123__456__78.tmp" image/svg+xml

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

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

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

为什么它不起作用,如何让它起作用?

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

它以某种方式被保留,因此需要转义;因为使用 Convention 插件它在一个字符串中,所以转义反斜杠也需要转义。

使用 image/svg\+xml 很有魅力:

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

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

fileUpload 拦截器使用 PatternMatcher 检查允许的 mime 类型。默认情况下,S2 使用 WildcardHelper 模式匹配器,它将与 image/svg+xml.

一起使用

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

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