request doesn‘t contain a multipart/form-data or multipart/form-data stream, content type header解决

12 篇文章 0 订阅

错误

当工程升级到SpringBoot2.1使用ServletFileUpload获取Request里面文件报错如下:

org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header is null

原因

首先需要了解的是SpringBoot2里自动装配了MultipartResolver

MultipartResolver

来自org.springframework.web.multipart包下的MultipartResolver提供解析包括文件上传在内的多部分请求策略。一种实现方式是基于Commons FileUpload,另外则基于Servlet 3.0的多部分请求解析。

启用多部分处理,需要在DispatcherServletSpring配置中声明一个名为multipartResolverMultipartResolverbean。DispatcherServlet检测到它并将其应用于传入的请求。当接收到一个content-typemultipart/form-data的POST请求时,解析程序将解析内容并将当前HttpServletRequest包装为MultipartHttpServletRequest,以提供对已解析部分的访问权限,此外将其作为请求参数公开。

而装配MultipartResolver的的配置是MultipartAutoConfiguration

MultipartAutoConfiguration

@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({ MultipartConfigElement.class,
			CommonsMultipartResolver.class })
	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;
	}

可以看出MultipartAutoConfiguration配置类,默认加载的是StandardServletMultipartResolver
然而,我们往往会在项目中加入commons-fileupload依赖,加载的是CommonsMultipartResolver。此时同时使用两个,会产生冲突

解决

1. 启动类排除

在启动类排除配置

@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})

2. 配置文件禁用

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

3. 自定义文件解析对象

    @Bean(name = "multipartResolver")
    public MultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        return resolver;
    }

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值