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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

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

作者:Mark_MMXIX 更新時(shí)間: 2022-03-15 編程語(yǔ)言

錯(cuò)誤

當(dāng)工程升級(jí)到SpringBoot2.1使用ServletFileUpload獲取Request里面文件報(bào)錯(cuò)如下:

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里自動(dòng)裝配了MultipartResolver

MultipartResolver

來(lái)自org.springframework.web.multipart包下的MultipartResolver提供解析包括文件上傳在內(nèi)的多部分請(qǐng)求策略。一種實(shí)現(xiàn)方式是基于Commons FileUpload,另外則基于Servlet 3.0的多部分請(qǐng)求解析。

啟用多部分處理,需要在DispatcherServletSpring配置中聲明一個(gè)名為multipartResolverMultipartResolverbean。DispatcherServlet檢測(cè)到它并將其應(yīng)用于傳入的請(qǐng)求。當(dāng)接收到一個(gè)content-typemultipart/form-data的POST請(qǐng)求時(shí),解析程序?qū)⒔馕鰞?nèi)容并將當(dāng)前HttpServletRequest包裝為MultipartHttpServletRequest,以提供對(duì)已解析部分的訪問(wèn)權(quán)限,此外將其作為請(qǐng)求參數(shù)公開(kāi)。

而裝配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配置類(lèi),默認(rèn)加載的是StandardServletMultipartResolver
然而,我們往往會(huì)在項(xiàng)目中加入commons-fileupload依賴,加載的是CommonsMultipartResolver。此時(shí)同時(shí)使用兩個(gè),會(huì)產(chǎn)生沖突

解決

1. 啟動(dòng)類(lèi)排除

在啟動(dòng)類(lèi)排除配置

@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})

2. 配置文件禁用

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

3. 自定義文件解析對(duì)象

    @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

欄目分類(lèi)
最近更新