项目以前是用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