直接上代码,代码中注释(代码出处https://www.cnblogs.com/liuyangv/p/8298997.html)
java 中的注释写的非常详细
先说下这段代码中出现的错误,js代码 后附上
1.
String realPath = this.getServletContext().getRealPath("/upload");报错this.getServletContext()
更改为:
request.getSession().getServletContext().getRealPath("/upload");
2.
List items =upload.parseRequest(req); 报错upload.parseRequest
更改为:
List items = upload.parseRequest(new ServletRequestContext(request));
3.
List items获取到空list
其中FileItemIterator iter = upload.getItemIterator(request);这段获取的是空值。
(引自:https://blog.csdn.net/zhou_pp/article/details/85060076)
问题的原因是:
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配置去除,问题就解决了。
在使用ServletFileUpload时需要关闭Spring Boot的默认配置 ,所以在配置文件中添加
spring.http.multipart.enabled=false
获取的是空值是最大的问题, 总结问题有
网上搜索该问题的解决方法,大致有以下两种:
(1)原因在于Spring的配置文件中已经配置了MultipartResolver,导致文件上传请求已经被预处理过了,所以此处解析文件列表为空,对应的做法是删除该段配置。
(2)认为是structs的过滤器导致请求已被预处理,所以也要修改对应过滤器的配置。
然而,在SpringBoot下,上述两种解决方法不可能做到,因为SpringBoot的相关配置都是自己完成的,根本没有显示的配置文件。况且以上两种解决方法,修改配置文件可能影响整个工程的其他部分,所以得另寻方案.
package cn.gs.ly;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
impor