HttpServletRequest request = ServletActionContext.getRequest();
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(419430400);
List<FileItem> items = upload.parseRequest(request);
以上代码是struts2 和 common-files 进行文件上传的功能,但是在最后一步中发现从request中解析的文件(FileItem)列表为空,
但是又能够确保前端的页面中的表单域中确实没有错误,那这是为什么呢?
原因在于,这里的request是被struts2 进行封装的,已经不再是原生的Servlet 请求,所以这个request无法被ServletFileUpload 解析,这就导致了列表为空;
那么解决的方法就是,使用没有被struts2封装过的request,可以在struts.xml中指定文件上传使用的request解析器,如下:
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
name="myRequestParser" class="com.mypkg.RequestParseWrapper"
scope="default" optional="true" />
<constant name="struts.multipart.handler" value="myRequestParser" />
其中com.mypkg.RequestParseWrapper是自己实现的类:
public class RequestParseWrapper extends JakartaMultiPartRequest{
//这里对parse方法进行了覆盖,使其无法封装request
public void parse(HttpServletRequest servletRequest, String saveDir)throws IOException {
}
}
这样就可以解决无法解析文件域的问题了