"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
.
一起使用
通过将默认模式匹配器更改为 regex
,fileUpload
拦截器开始使用正则表达式检查允许的类型。而+
是regex中的一个特殊字符,所以必须像image/svg\+xml
那样转义才能工作。
注意:在这种情况下更改默认模式匹配器会引入意外行为,可能应该作为错误报告。
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
.
通过将默认模式匹配器更改为 regex
,fileUpload
拦截器开始使用正则表达式检查允许的类型。而+
是regex中的一个特殊字符,所以必须像image/svg\+xml
那样转义才能工作。
注意:在这种情况下更改默认模式匹配器会引入意外行为,可能应该作为错误报告。