Spring boot MultipartResolver

【参考文章】:Required MultipartFile parameter 'file' is not present

【参考文章】:Springboot2.0 中 WebMvcConfigurerAdapter 过时问题处理

【参考文章】:spring boot EnableAutoConfiguration exclude 无效

实现了 MultipartResolver 常用接口有两个:

  一个是  CommonsMultipartResolver:使用 Jakarta Commons FileUpload 解析 multipart 请求;

  一个是 StandardServletMultipartResolver:依赖于 Servlet 3.0 解析 multipart 请求;

1. StandardServletMultipartResolver 

  Spring boot 默认使用 StandardServletMultipartResolver 解析 multipart 请求;

@Configuration
@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 {
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> MultipartProperties multipartProperties;

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MultipartAutoConfiguration(MultipartProperties multipartProperties) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.multipartProperties =<span style="color: rgba(0, 0, 0, 1)"> multipartProperties;
}

@Bean
@ConditionalOnMissingBean({ MultipartConfigElement.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">,
        CommonsMultipartResolver.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> })
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> MultipartConfigElement multipartConfigElement() {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.multipartProperties.createMultipartConfig();
}

@Bean(name </span>=<span style="color: rgba(0, 0, 0, 1)"> DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> StandardServletMultipartResolver multipartResolver() {
    StandardServletMultipartResolver multipartResolver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StandardServletMultipartResolver();
    multipartResolver.setResolveLazily(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.multipartProperties.isResolveLazily());
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> multipartResolver;
}

}

2. CommonsMultipartResolver

2.1 排除默认配置

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration

2.2 添加 CommonsMultipartResolver 的依赖

         <!--文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

2.3 创建文件解析对象

@Slf4j
@Configuration
public class  WebMvcConfig implements WebMvcConfigurer {
<span style="color: rgba(255, 0, 0, 1)">@Bean(name </span></span><span style="color: rgba(255, 0, 0, 1)">= "multipartResolver")
</span><span style="color: rgba(0, 0, 255, 1)">public </span><span style="color: rgba(0, 0, 0, 1)">MultipartResolver multipartResolver() {
    log.info(</span>"Loading the multipart resolver"<span style="color: rgba(0, 0, 0, 1)">);
    CommonsMultipartResolver multipartResolver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CommonsMultipartResolver();
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> multipartResolver;
}

}