SpringBoot使用ServletFileUpload接收上传文件为null问题的解决

项目以前是用SpringMvc开发的,最近打算用SpringBoot进行改装,上传的内容有文件和表单,以下是文件上传部分的代码:

@RequestMapping("/FileUpload")
public void FileUpload(HttpServletRequest request,HttpServletResponse response,@RequestParam("file") MultipartFile file)throws Exception{  
	Map<String, Object>map=new HashMap<String, Object>();
	log.info("开始FileUpload");
	//存储文件的路径
	String savePath=request.getSession().getServletContext().getRealPath("/uploads");
	DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
	List items = upload.parseRequest(request);
	Iterator itr = items.iterator();
	while (itr.hasNext()) {

      <!--中间代码省略-->

       }
 }
         

调试到items这里发现items为一个空数组,所以while循环这里进不去,直接跳过去了,程序也跑完了,文件没有上传成功。

大部分网友给出的解决方案是:在application.properties添加以下代码:

spring.http.multipart.enabled=false

给出的原因也很充分:

spring-boot自带的org.springframework.web.multipart.MultipartFile
和Multipart产生冲突,如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。因此将multipartResolve配置去除。

我试了下,不管用,不知是不是哪是还要配置什么。后面偶然看到一位的大神的办法,他的方法描述比较详细,大体是这样,1、注册一个新的文件解析器multipartResolver

@Configuration
public class BaseConfig {

    @Bean(name = "multipartResolver")
    public MultipartResolver multipartResolver(){
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        resolver.setResolveLazily(true);//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
        resolver.setMaxInMemorySize(40960);
        resolver.setMaxUploadSize(50*1024*1024);//上传文件大小 50M 50*1024*1024
        return resolver;
    }

}

2.同时在application.properties加上:
spring.http.multipart.enabled=true,此外作者设为true,我表示怀疑,应该是false才对吧 

3..然后在启动项目的Application.java添加部分注解,并继续自WebMvcConfigurationSupport,详细参照如下:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
@EnableAsync
@ServletComponentScan
@EnableScheduling
public class Application extends WebMvcConfigurationSupport {

public static void main(String[] args) {
	SpringApplication.run(Application.class, args);
}


@Override
public void addInterceptors(InterceptorRegistry registry){
	AuthorizationInterceptor authorizationInterceptor = new AuthorizationInterceptor();
	registry.addInterceptor(authorizationInterceptor);
	super.addInterceptors(registry);
}

然后在Controller接口上通过 @RequestParam(“excel”) MultipartFile excel来接收文件上传请求就好
@RequestMapping(value = “/import”,method = RequestMethod.POST)
public void upload( @RequestParam(“excel”) MultipartFile excel){
System.out.println(“success”);
}
我试了下,也不适合我的情形,最后参照以前做的项目,进行修改,去掉BaseConfig ,去掉application.properties新加的代码:
spring.http.multipart.enabled=false,然后修改启动类代码,

下面是我启动类的代码:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
@EnableAsync
@ServletComponentScan
@EnableScheduling
@MapperScan("com.cs.cbc.*.mapper")
public class SpringBootApplication
{   
	 public static void main( String[] args )
    {
       SpringApplication.run(SpringBootApplication.class, args);
    }
    
   
 
}

最后将上传接口中,@RequestParam("file") MultipartFile file去掉,再调试,解析文件和表单成功!文件最终也成功上传。

最后我想说:每个人的项目配置和需求都不一样,别人的办法能适配于自己的项目,但由于你的项目很多地方配置跟别人的不一样,找准自己的作调整,经过多次试错,最终能把问题解决。感谢这位博主的方法:https://blog.csdn.net/qq_34244479/article/details/88063390


 

发布了137 篇原创文章 · 获赞 28 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/shenxiaomo1688/article/details/99299931