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" />
  <message-resources parameter="ApplicationResources"/>以上是我现在知道的解决方案,不知道能不能暂时解决大家的问题。
欢迎大家积极讨论,批评指正。我的msn:[email protected]

解决方案 »

  1.   

    我没详细看你的信息
    我想是因为  ”enctype="multipart/form-data“,让客户端的数据以2进制的方式传输,
    所以服务器端用request接受不到数据,一下面的方式可以接受,你试试吧!ServletInputStream sis = request.getInputStream();
    sis = request.getInputStream();
    byte [] b = new byte[1024];
    int a = 0;
    String s = "";
    while ((a = sis.readLine(b, 0, b.length)) != -1) {
          s = new String(b, 0, a);
    }
      

  2.   

    在struts1中..只要不加actionform的话..就可以用
    public ActionForward uploadfile(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {

    System.out.println("xxx");
    try {
    request.setCharacterEncoding("UTF-8");
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setHeaderEncoding(request.getCharacterEncoding());

    List items = (List) upload.parseRequest(request);

    Iterator iter = items.iterator();
    while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next(); if (item.isFormField()) {
    String name = item.getFieldName();
    String value = item.getString();
    System.out.println("name = " + name);
    System.out.println("value = " + value);
    System.out.println("/r/n");
    } else {
    UploadFileVO uploadFileVO = new UploadFileVO();
    uploadFileVO.setFieldName(item.getFieldName());
    uploadFileVO.setFileContent(item.get());
    uploadFileVO.setFileContentType(item.getContentType());
    uploadFileVO.setFileSize(item.getSize());
    uploadFileVO.setFileName(item.getName());
    String fieldName = item.getFieldName();
    String fileName = item.getName();
    //boolean isInMemory = item.isInMemory();
    long sizeInBytes = item.getSize();
    getListInSession(request).add(fileName);
    getListInSession(request).add(UUID.randomUUID());
    iHomeWorkRegisterServiceAOP= this.getHomeworkregisterServiceImpl();
    iHomeWorkRegisterServiceAOP.save(uploadFileVO);
    /*
    System.out.println("fieldName = " + fieldName);
    System.out.println("fileName = " + fileName);
    System.out.println("contentType = " + contentType);
    System.out.println("isInMemory = " + isInMemory);
    System.out.println("sizeInBytes = " + sizeInBytes);
    System.out.println("br");
    */
    }
    }
    System.out.println("-------- final--------");
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return null;
    }