<小时 />重要说明:以下问题已在 Struts 版本
2.3.24
中修复。从那个版本开始,就没有必要转义任何角色。
阅读更多:JIRA问题WW-4457。
我已经将 Struts2 文件上传拦截器配置为允许内容类型的白名单。
这适用于与指定的内容类型匹配的任何文件,但不适用于具有 MIME 媒体类型 image/svg+xml
的SVG
文件。
使用此配置:
@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
一起使用。
通过将默认模式匹配器更改为regex
,fileUpload
拦截器开始使用正则表达式检查允许的类型。+
是正则表达式中的一个特殊字符,因此必须像image/svg\+xml
那样对其进行转义才能工作。
注意:在这种情况下,更改默认模式匹配器会引入意外行为,可能应报告为错误。
MIME 中的+
符号是罪魁祸首。
以某种方式被保留,因此需要被转义;由于使用约定插件,它位于字符串内,因此转义反斜杠也需要转义。
使用image/svg\+xml
就像一个魅力:
params = { "fileUpload.allowedTypes" , "application/pdf,"
+ "image/jpeg,"
+ "image/gif,"
+ "image/png,"
+ "image/svg\+xml"
我不确定基于 XML 的标准配置是否需要这样做。