la solicitud no contiene un encabezado de tipo de contenido multipart / form-data o multipart / form-data 解决

error

Cuando el proyecto se actualiza a SpringBoot2.1, use ServletFileUpload para obtener el archivo en la Solicitud y el error es el siguiente:

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

la razón

Lo primero que debe comprender es que MultipartResolver se ensambla automáticamente en SpringBoot2

MultipartResolver

Proporciona análisis de estrategias de solicitud de varias partes, incluida la carga de archivos desde el org.springframework.web.multipartpaquete MultipartResolver. Una forma se basa en Commons FileUploady la otra se basa Servlet 3.0en el análisis de solicitudes de varias partes.

Habilitar el proceso de múltiples partes, tenemos que DispatcherServletdeclarar una configuración de Spring llamada multipartResolverdel MultipartResolverfrijol. DispatcherServletSe detecta y se aplica a la solicitud entrante. Cuando un content-typemultipart/form-datase recibe la solicitud POST, el programa de análisis analizará el contenido y HttpServletRequestenvolver el contenido actual MultipartHttpServletRequestpara proporcionar acceso a la parte analizada, y también exponerlo como un parámetro de la petición.

Y la configuración para ensamblar MultipartResolver esMultipartAutoConfiguration

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

Se puede ver que la clase de configuración MultipartAutoConfiguration se carga por defecto StandardServletMultipartResolver.
Sin embargo, a menudo agregamos commons-fileuploaddependencias al proyecto y cargamos CommonsMultipartResolver. Use dos al mismo tiempo, producirá 冲突.

resolver

1. Exclusión de inicio

Excluir la configuración en la clase de inicio

@SpringBootApplication(exclude = {
    
    MultipartAutoConfiguration.class})

2. Perfil inhabilitado

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

3. Objeto de análisis de archivo personalizado

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

Supongo que te gusta

Origin blog.csdn.net/qq_28540443/article/details/107367572
Recomendado
Clasificación