1

重要提示:以下问题已在 Struts 版本中得到修复2.3.24

从那个版本开始,不需要转义任何字符。

阅读更多:JIRA 问题 WW-4457


我已将 Struts2 FileUpload 拦截器配置为允许 Content-Types 白名单。

这适用于与指定的 Content-Type 匹配的任何文件,但不适用于SVG具有MIME 媒体类型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

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

{3}用户尝试上传的 Content-Type在哪里;

然后例如:

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

这与我在白名单中定义的 Content-Type完全相同allowedTypes

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

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

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

4

2 回答 2

1

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

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

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

于 2015-02-04T09:59:32.390 回答
1

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

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

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

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

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

于 2015-02-03T17:06:34.383 回答