学而实习之 不亦乐乎

SpringBoot 中 MultipartResolver 文件上传相关配置

2024-01-28 20:58:23

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;
    }
}