upload.parseRequest(request) 结果为null的一个恶心处理法

本文解决了Struts2框架中使用common-fileupload组件上传文件时遇到的问题,通过调整过滤器映射和自定义Filter实现了文件上传功能。
一、项目基本环境:struts2等

二、基本需求&问题:需要自己写程序调用common-fileupload来处理上传的文件,但在代码调用upload.parseRequest(request)来处理时,返回了空的items

三、处理方法
1、按照网上找到对该问题的相关处理方法:

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

修改为

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>


这个处理方法的细节可以参考[url]http://topic.youkuaiyun.com/u/20090514/10/ba62c761-e591-4c9e-859a-87907634ea13.html[/url]

2、我的处理方法
对于第1钟处理方式,网友们的意思应该是别让请求经过struts2,免得inputStream被提前读取了。虽然这样可以正常使用common-fileupload了,但这样就不经过struts2的拦截器了,而我又想让它拦一次,于是,我自己实现一个servlet.Filter,并且把它的filter次序放到struts2的filter次序之前。主要源码如下:

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(new StrutsRequestWrapper((HttpServletRequest) request), response);
}

这里先用StrutsRequestWrapper来给他wrapper一次,这样在经过struts2的filter的时候就不会有问题了。为啥呢?可以自己看看这个类
org.apache.struts2.dispatcher.Dispatcher里面的wrapRequest方法,有这么个判断:

// don't wrap more than once
if (request instanceof StrutsRequestWrapper) {
return request;
}


挺恶心的处理方式吧,我也觉得。因为暂时没想到更好的处理方式了,先这样做,把功能实现先。

如果以后有其他网友看到我这里的记录,而且有更好的建议,欢迎一起讨论。
package com.inc.sbu.util; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.List; import javax.servlet.http.Part; import java.util.Collection; public class FileUploadInterceptor implements Interceptor { private static final long serialVersionUID = 1L; @Override public void init() { // 初始化逻辑 } @Override public void destroy() { // 销毁逻辑 } @Override public String intercept(ActionInvocation invocation) throws Exception { HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); System.out.println("do newInterceptor..............."); if (ServletFileUpload.isMultipartContent(request)) { System.out.println("111do newInterceptor..............."); DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(1024 * 1024 * 10); // 设置最大上传大小为5MB String contentType = request.getContentType(); if (contentType == null || !contentType.startsWith("multipart/form-data")) { // 请求类型不匹配,非 multipart/form-data System.out.println("requestType error..............."); } List<FileItem> items_test = upload.parseRequest(request); if (items_test == null || items_test.isEmpty()) { // 上传数据为空,可能请求已被封装或流被提前读取 System.out.println("dateEmpty error..............."); //方法一:使用原生 Servlet API 解析上传请求 Collection<Part> parts = request.getParts(); if (parts == null || parts.isEmpty()) { // 上传数据为空 System.out.println("dateEmpty..............."); } else { System.out.println("dateNotEmpty..............."); for (Part part : parts) { String name = part.getName(); String fileName = part.getSubmittedFileName(); if (fileName != null && !fileName.isEmpty()) { // 文件上传字段 //InputStream fileContent = part.getInputStream(); // 理文件内容 } else { // 普通表单字段 //BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), StandardCharsets.UTF_8)); //String value = reader.lines().collect(Collectors.joining("\n")); // 理普通字段值 } } } }else{ //方法二 List<FileItem> items = upload.parseRequest(request); System.out.println("222do newInterceptor..............."+items.size()); for (FileItem item : items) { System.out.println("333do newInterceptor..............."); if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); System.out.println("upload FileName..............."+fileName); String uploadPath = "/path/to/upload/directory"; File uploadDir = new File(uploadPath); if (!uploadDir.exists()) { uploadDir.mkdir(); } File uploadedFile = new File(uploadDir + File.separator + fileName); item.write(uploadedFile); } } } } return invocation.invoke(); } } 在struts2架构下,已通过自定义拦截器接替了有高危漏洞的fileupload原生拦截器,但在代码理过程中,List<FileItem> items_test = upload.parseRequest(request);长度为空,尝试用part方法替代,但框架不支持,请问有什么替代方法
08-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值