一、Spring boot上传自动配置的有哪些?
1、自动配置MultipartAutoConfiguration类
配置文件在Spring-boot-autoconfig下org.springframework.boot.autoconfigure.web包内
MultipartAutoConfiguration类我们先看下他的关系图
springboot 的源代码如下:
@Configuration @ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class }) @ConditionalOnProperty(prefix = "spring.http.multipart", name = "enabled", matchIfMissing = true) @EnableConfigurationProperties(MultipartProperties.class) public class MultipartAutoConfiguration { private final MultipartProperties multipartProperties; public MultipartAutoConfiguration(MultipartProperties multipartProperties) { this.multipartProperties = multipartProperties; } @Bean @ConditionalOnMissingBean public MultipartConfigElement multipartConfigElement() { return this.multipartProperties.createMultipartConfig(); } @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) @ConditionalOnMissingBean(MultipartResolver.class) public StandardServletMultipartResolver multipartResolver() { StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver(); multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily()); return multipartResolver; } }
我们那可以清楚的知道@ConditionalOnClass这类只是在特定的类加载后才使用。
@ConditionalOnClass({Servlet.class,StandardServletMultipartResolver.class,MultipartConfigElement.class}) @ConditionalOnProperty(prefix = "spring.http.multipart", name = "enabled", matchIfMissing = true)
使用@EnableConfigurationProperties开启使用自动配置的文件,当配置文件缺失的时候默认 spring.http.multipart.enabled为true
二、上传的通用配置文件说明
@ConfigurationProperties(prefix = "spring.http.multipart", ignoreUnknownFields = false) public class MultipartProperties { /** * Enable support of multi-part uploads. * 默认使用multi-part的上传 */ private boolean enabled = true; /** * Intermediate location of uploaded files. */ //上传的临时目录 private String location; /** * Max file size. Values can use the suffixed "MB" or "KB" to indicate a Megabyte or * Kilobyte size. */ private String maxFileSize = "1Mb"; /** * Max request size. Values can use the suffixed "MB" or "KB" to indicate a Megabyte * or Kilobyte size. */ private String maxRequestSize = "10Mb"; /** * Threshold after which files will be written to disk. Values can use the suffixed * "MB" or "KB" to indicate a Megabyte or Kilobyte size. */ private String fileSizeThreshold = "0"; /** * Whether to resolve the multipart request lazily at the time of file or parameter * access. */ private boolean resolveLazily = false; //省略setting和getting方法 /** * Create a new {@link MultipartConfigElement} using the properties. * @return a new {@link MultipartConfigElement} configured using there properties */ public MultipartConfigElement createMultipartConfig() { MultipartConfigFactory factory = new MultipartConfigFactory(); if (StringUtils.hasText(this.fileSizeThreshold)) { factory.setFileSizeThreshold(this.fileSizeThreshold); } if (StringUtils.hasText(this.location)) { factory.setLocation(this.location); } if (StringUtils.hasText(this.maxRequestSize)) { factory.setMaxRequestSize(this.maxRequestSize); } if (StringUtils.hasText(this.maxFileSize)) { factory.setMaxFileSize(this.maxFileSize); } return factory.createMultipartConfig(); }
/** * Factory that can be used to create a {@link MultipartConfigElement}. Size values can be * set using traditional {@literal long} values which are set in bytes or using more * readable {@literal String} variants that accept KB or MB suffixes, for example: * 就是处理传统配置的KB与MB的转换,其他的并没什么。主要是是最后都是kb * <pre class="code"> * factory.setMaxFileSize("10Mb"); * factory.setMaxRequestSize("100Kb"); * </pre> * * @author Phillip Webb * @since 1.4.0 */ public class MultipartConfigFactory { private String location; private long maxFileSize = -1; private long maxRequestSize = -1; private int fileSizeThreshold = 0; //省略 setting和getting /** * Create a new {@link MultipartConfigElement} instance. * @return the multipart config element */ public MultipartConfigElement createMultipartConfig() { return new MultipartConfigElement(this.location, this.maxFileSize, this.maxRequestSize, this.fileSizeThreshold); } }
三、配置文件加载以后,创建处理的组件。
1 @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)//渲染的组件Bean 2 @ConditionalOnMissingBean(MultipartResolver.class) 3 public StandardServletMultipartResolver multipartResolver() { 4 StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver(); 5 multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily()); 6 return multipartResolver; 7 }
四、MultipartResolver介绍。
@Override public boolean isMultipart(HttpServletRequest request) { return (request != null && ServletFileUpload.isMultipartContent(request)); } @Override public MultipartHttpServletRequest resolveMultipart(final HttpServletRequest request) throws MultipartException { Assert.notNull(request, "Request must not be null"); if (this.resolveLazily) { return new DefaultMultipartHttpServletRequest(request) { @Override protected void initializeMultipart() { MultipartParsingResult parsingResult = parseRequest(request); setMultipartFiles(parsingResult.getMultipartFiles()); setMultipartParameters(parsingResult.getMultipartParameters()); setMultipartParameterContentTypes(parsingResult.getMultipartParameterContentTypes()); } }; } else { MultipartParsingResult parsingResult = parseRequest(request); return new DefaultMultipartHttpServletRequest(request, parsingResult.getMultipartFiles(), parsingResult.getMultipartParameters(), parsingResult.getMultipartParameterContentTypes()); } }
五、CommonsMultipartResolver与StandardServletMultipartResolve介绍。