SpringBoot resolveMultipart.getFile为null异常报空问题的解决办法

使用 MultipartHttpServletRequest resolveMultipart = commonsMultipartResolver.resolveMultipart(request); 

出现 resolveMultipart.getFile("file"); 打印null,无法获取文件参数

CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
commonsMultipartResolver.resolveMultipart(request);
MultipartHttpServletRequest resolveMultipart = commonsMultipartResolver.resolveMultipart(request);
System.out.println(commonsMultipartResolver.isMultipart(request));
// 这里打印了null ,前端检查没有错误字段也是对的
System.out.println(resolveMultipart.getFile("file"));

/**
*TODO  resolveMultipart.getFile("file") 获取上传文件时为null
*  原因:spring-boot自带的org.springframework.web.multipart.MultipartFile和Multipart产生冲突,如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。
*  整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。
*  后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。因此将spring-boot自带的multipartResolve配置去除,问题就解决了
*  MultiPartFile获取不到文件为null
*  解决方法一: 在spring-boot配置文件application.yml  禁用spring-boot自带的org.springframework.web.multipart.MultipartFile,
*       Spring Boot 2.0.0 以下版本配置  spring.http.multipart.enabled=false  禁用自带的 multipart
*       Spring Boot 2.0.0 或更高版本配置  spring.servlet.multipart.enabled=false  禁用自带的 multipart
*  解决方法二: 在Application 启动文件中配置 排除项  @SpringBootApplication(exclude = {MultipartAutoConfiguration.class})
*
**/

解决办法一:(配置application.yml文件)

  ## resolveMultipart.getFile("file") 获取上传文件时为null
  ## 原因:spring-boot自带的org.springframework.web.multipart.MultipartFile和Multipart产生冲突,如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。
  ## 整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。
  ## 后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。因此将spring-boot自带的multipartResolve配置去除,问题就解决了
  ## MultiPartFile获取不到文件为null
  ## 解决方法一: 在spring-boot配置文件application.yml  禁用spring-boot自带的org.springframework.web.multipart.MultipartFile,
  ## 解决方法二: 在Application 启动文件中配置 排除项  @SpringBootApplication(exclude = {MultipartAutoConfiguration.class})
  ## spring.http.multipart.enabled已被替换为spring.servlet.multipart.enabled
  ## 如果您使用的是Spring Boot 2.0.0或更高版本,则应该使用spring.servlet.multipart.enabled

  ## 解决办法:Spring Boot 2.0.0 以下版本配置  spring.http.multipart.enabled=false  禁用自带的 multipart
#  http:
#    multipart:
#      enabled: false


  ## 解决办法:Spring Boot 2.0.0 或更高版本配置  spring.servlet.multipart.enabled=false  禁用自带的 multipart
#  servlet:
#    multipart:
#      enabled: false

解决办法二:(springboot2.0启动文件Application.java中排除MultipartAutoConfiguration.class)

@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

你可能感兴趣的:(java,spring,开发语言)