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.multipart
paqueteMultipartResolver
. Una forma se basa enCommons FileUpload
y la otra se basaServlet 3.0
en el análisis de solicitudes de varias partes.
Habilitar el proceso de múltiples partes, tenemos que
DispatcherServlet
declarar una configuración de Spring llamadamultipartResolver
delMultipartResolver
frijol.DispatcherServlet
Se detecta y se aplica a la solicitud entrante. Cuando uncontent-type
símultipart/form-data
se recibe la solicitud POST, el programa de análisis analizará el contenido yHttpServletRequest
envolver el contenido actualMultipartHttpServletRequest
para 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-fileupload
dependencias 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;
}