日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:Mark_MMXIX 更新時間: 2022-03-15 編程語言

錯誤

當工程升級到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;
    }

原文鏈接:https://blog.csdn.net/qq_28540443/article/details/107367572

欄目分類
最近更新