Spring5.x文件上传解析流程
获取文件名
获取到Content-Disposition
截取字符串到第一次出现 ;
值为type(会去掉type的多余空白字符) 如果为空则报错
经过两个双引号一个分号 截取字符串
参数为filename*
如果是filename* 则会对上传的文件名进一步处理
例如用Content-Disposition: form-data; name="file"; filename*= UTF-8''a.jsp
单引号中间可以填充任何字符
decodeFilename方法中 如果文件名是url编码,会进行url解码
所以可以这样写Content-Disposition: form-data; name="file"; filename*= ISO_8859_1'sssdd'%61%64%64%64%2E%6A%73%70
Content-Disposition: form-data; name="file"; filename*= UTF-8'sssdd'%61%64%64%64%2E%6A%73%70
参数为filename时
else if (attribute.equals("filename") && (filename == null)) {
if (value.startsWith("=?") ) {
Matcher matcher = BASE64_ENCODED_PATTERN.matcher(value);
if (matcher.find()) {
String match1 = matcher.group(1);
String match2 = matcher.group(2);
filename = new String(Base64.getDecoder().decode(match2), Charset.forName(match1));
}
else {
filename = value;
}
}
else {
filename = value;
}
}
判断开头是否为=?
然后是进行正则匹配,正则表达式为:=\\?([0-9a-zA-Z-_]+)\\?B\\?([+/0-9a-zA-Z]+=*)\\?=
大概是这个样子=?utf-8?B?YS5qc3A=?
前边是编码方式 可以选择多种如utf-8,gbk 后边是base64编码的文件名
Spring5.x文件上传解析流程
http://example.com/2022/11/18/安全/Java安全/Java基础/Spring5.x文件上传解析流程/