目录
StandardServletMultipartResolver
启动时DispatcherServlet被装载进Tomcat
Form-data里不是文件的入参被添加进Request的Parameters集合里
SpringBoot内嵌Tomcat(3)- 【组件结构及初始化】源码简析https://my.oschina.net/u/3434392/blog/3213796
上文中,描述了 Tomcat的组件结构:
StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[].StandardWrapper[dispatcherServlet]
对于整个文件上传请求的处理流程,要结合Tomcat各组件层级结构和它们的加载初始化过程来理解。
spring启动时的装配过程
application.yml
spring.servlet.multipart:
max-file-size: 10MB # 文件的最大大小
max-request-size: 50MB # 请求的最大大小
file-size-threshold: 0 # 文件大小阈值,当大于这个阈值时将写入到磁盘,否则在内存中。 默认值为0
自动装配: org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {
它实例化的3个对象:
- MultipartProperties :它对上面3个参数有默认赋值。 @EnableConfigurationProperties
-
MultipartConfigElement :由MultipartProperties的参数创建而成,并在DispatcherServletAutoConfiguration里注入给创建的DispatcherServletRegistrationBean对象。
这里因为示例中没有配置“location” 属性, 所以这里初始值为空字符串。 最大文件字节、最大请求字节
- StandardServletMultipartResolver :request请求的解析处理类,这里是创建的MultipartHttpServletRequest是StandardMultipartHttpServletRequest
StandardServletMultipartResolver
判定有文件流上传请求的依据: request的content-type是以‘multipart/’开头。
public class StandardServletMultipartResolver implements MultipartResolver {
private boolean resolveLazily = false; // 在multipart类型请求进入时是否立即解析
public void setResolveLazily(boolean resolveLazily) {
this.resolveLazily = resolveLazily;
}
// 判定request的content-type 是 multipart
public boolean isMultipart(HttpServletRequest request) {
return StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/");
}
// 封装原request为StandardMultipartHttpServletRequest, 它里面有解析这种请求的处理方法
@Override
public MultipartHttpServletR