日期:2014-05-20  浏览次数:20773 次

struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file") 是null的问题分析
struts中post方式上传文件,enctype= "multipart/form-data ",request.getParameter( "file ")   是null的问题分析  

这两天连续看到有人提到:struts中post方式上传文件,enctype= "multipart/form-data ",request.getParameter( "file ")时候,得到一个Null,或者直接得到   java.lang.IllegalArgumentException   这样一个异常。

结合到自己以前也遇到过这个问题,于是上网搜索了一些资料,下面这位网友的说法我觉得有些道理,因此摘抄下来。

> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >   引用
使用struts进行文件上传,如果有些参数没有完全定义在ActionForm中,需要从request.getParameter获取,在表单提交并且validate失败返回input页面时,这部分需要从request.getPrameter获取的参数数据都丢失了,即使再对request进行multipart解析也不能得到。

经过分析,发现struts的ActionServlet在接收到multipart请求之后,在RequestProcessor中会对request进行封装:MultiRequestWrapper,然后在Action执行完之后,又将已经封装的request重新还原。以下是部分代码,截直RequestProcessor:

封装:   下面是struts的源代码:

protected   HttpServletRequest   processMultipart(HttpServletRequest   request)   {

        if   (! "POST ".equalsIgnoreCase(request.getMethod()))   {
                return   (request);
        }
       
        String   contentType   =   request.getContentType();
        if   ((contentType   !=null)   &&
                contentType.startsWith( "multipart/form-data "))   {
                return   (new   MultipartRequestWrapper(request));
        }else{
                return   (request);
        }

    }

< < < < < < < < < < < < < < < < < < < < < < <

接下来我们需要作的就是将已经封装成MultipartRequestWrapper的HttpServletRequest进行还原。
解决方法: 
① 写一个类,继承org.apache.struts.action.RequestProcessor   ,并且override其中的doForward方法来进行解析。

package   org.luyang;
import   java.io.IOException;

import   javax.servlet.ServletException;
import   javax.servlet.http.HttpServletRequest;
import   javax.servlet.http.HttpServletResponse;

import   org.apache.struts.upload.MultipartRequestWrapper;

public   class   RequestProcessor   extends   org.apache.struts.action.RequestProcessor   {

        protected   void   doForward(String   uri,   HttpServletRequest   request,     HttpServletResponse   response)   throws   IOException,   ServletException   {
                HttpServletRequest   myRequest   =   request;
                if   (request   instanceof   MultipartRequestWrapper)   {
                        myRequest   =   ((MultipartRequestWrapper)   request).getRequest();
                }
                super.doForward(uri,   myRequest,   response);
        }
}

②在自己的struts-config.xml的 <struts-config> </struts-config> 之间加入下面这句话

    <controller   processorClass= "org.luyang.RequestProcessor "   />