SpringBoot 中 MultipartResolver 文件上传相关配置
spring.servlet.multipart 相关配置
这些配置是给 StandardServletMultipartResolver 用的,如果自定义了 CommonsMultipartResolver,这些配置就会失效,因为SpringBoot自动装配的默认选择问题。
spring.servlet.multipart.enabled=true
# 总上传数据大小
spring.servlet.multipart.max-request-size=1GB
# 单文件大小
spring.servlet.multipart.max-file-size=1GB
# 文件达到多少磁盘写入
spring.servlet.multipart.file-size-threshold=100MB
# 直接存服务器的路径
spring.servlet.multipart.location=/home
SpringBoot对multipartResolver的自动装配: MultipartAutoConfiguration
1.multipartResolver的默认实现StandardServletMultipartResolver:
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)这个bean的名字,就是multipartResolver,是生成的StandardServletMultipartResolver,
2.CommonsMultipartResolver是默认不生成的
@ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class }),默认没CommonsMultipartResolver的bean才创建配置
3.spring.servlet.multipart是给StandardServletMultipartResolver用的
所以如果我就要用CommonsMultipartResolver生成bean,spring.servlet.multipart白配
/**
 * {@link EnableAutoConfiguration Auto-configuration} for multi-part uploads. Adds a
 * {@link StandardServletMultipartResolver} if none is present, and adds a
 * {@link javax.servlet.MultipartConfigElement multipartConfigElement} if none is
 * otherwise defined. The {@link ServletWebServerApplicationContext} will associate the
 * {@link MultipartConfigElement} bean to any {@link Servlet} beans.
 * <p>
 * The {@link javax.servlet.MultipartConfigElement} is a Servlet API that's used to
 * configure how the server handles file uploads.
 */
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
//"spring.servlet.multipart"配置的开启
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {
    private final MultipartProperties multipartProperties;
    //"spring.servlet.multipart"配置的引入
    public MultipartAutoConfiguration(MultipartProperties multipartProperties) {
        this.multipartProperties = multipartProperties;
    }
    //没CommonsMultipartResolver才使用"spring.servlet.multipart"配置
    @Bean
    @ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class })
    public MultipartConfigElement multipartConfigElement() {
        return this.multipartProperties.createMultipartConfig();
    }
    //默认生成StandardServletMultipartResolver
    @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
    @ConditionalOnMissingBean(MultipartResolver.class)
    public StandardServletMultipartResolver multipartResolver() {
        StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
        multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
        return multipartResolver;
    }
}
自定义multipartResolver
如果不改spring.servlet.multipart前缀,SpringBoot还是会检查报错的,所以改一下
my:
  servlet:
    multipart:
      maxUploadSize: 1073741824
      maxInMemorySize: 104857600
@Data
@Configuration
@ConfigurationProperties(prefix = "my.servlet.multipart", ignoreUnknownFields = false)
public class MultipartAutoConfiguration {
    private long maxUploadSize;
    private int maxInMemorySize;
    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver getCommonsMultipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(this.maxUploadSize);
        multipartResolver.setMaxInMemorySize(this.maxInMemorySize);
        return multipartResolver;
    }
}
 
