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文件上传解析流程/
作者
Autumn
发布于
2022年11月18日
许可协议