upload.parseRequest(request) 结果为null

 

原因:

          

原因是你web.xml中,struts2的过滤器,把HttpServletRequest变成了MultiPartRequest,所以
upload.parseRequest(request); 必然是null。

解决方法是,在web.xml中
将/* 改成.action

----------------------------------------

其他做法:

个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;
    }

可以查看 http://auzll.iteye.com/blog/919981 具体解决方法



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、付费专栏及课程。

余额充值