如果我使用MultipartConfig注释servlet,则无法使用ApacheCommons进行fileupload

时间:2013-01-21 16:36:20

标签: java java-ee servlets upload apache-commons

如果我使用@MultipartConfig注释以下servlet,则无法使用Apache common upload

@MultipartConfig

public class SendTheFileName extends HttpServlet {
  // something
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
           moveToSharedDirectory(request,path); // call to upload
  }
}

例如:

public boolean moveToSharedDirectory(HttpServletRequest request,String path) {
    System.out.println("1. OUTSIDE THE TRY BLOCK OF UPLOAD CLASS");
    try {
       System.out.println("2. IN THE TRY BLOCK OF UPLOAD CLASS");
       boolean isMultipart = ServletFileUpload.isMultipartContent(request);
       System.out.println("3. AFTER THE BOOLEAN STATEMENT " + isMultipart);
       if(!isMultipart) {
           // Error:File cannot be uploaded
           System.out.println("Message : IS NOT MULTIPART");
       } else {
           DiskFileItemFactory dfif = new DiskFileItemFactory();
           ServletFileUpload fileUpload = new ServletFileUpload(dfif);
           List list = null;
           list = fileUpload.parseRequest(request); // returns a list of FileItem instances parsed from the request
           Iterator iterator = list.iterator();
           System.out.println("4. JUST BEFORE ENTERING THE WHILE LOOP");
           System.out.println("5. CHECKING IF THE ITERATION HAS ANY ELEMENT : " + iterator.hasNext());

           // ... some more here {-}
         }
    } // close catch
} 

上面代码段中的陈述:

System.out.println("5. CHECKING IF THE ITERATION HAS ANY ELEMENT : " + iterator.hasNext());

打印false!那是为什么?

如果删除注释,我会true并且能够上传文件。

对应的HTML:

<form method="post" action="SendTheFileName" enctype="multipart/form-data">
                <div id="Files_to_be_shared"> 
                      <input type="file" id="File" name="FileTag" />
                      <input type="submit" value="Share" /> 
                    </div>
 </form>

注意:出于某种原因,我不得不使用apache commons来上传文件。

1 个答案:

答案 0 :(得分:3)

@MultipartConfig在servlet的multipart/form-data被调用之前触发Servlet 3.0内置service()请求正文解析。因此,当它轮到解析请求时,Apache Commons FileUpload将面临一个空的请求体。换句话说,你不能混合它们。将它们混合起来也没有任何意义,因为它们都完全相同。

您有两个选择:

  1. 删除@MultipartConfig并保留Apache Commons FileUpload。

  2. 或者,保留@MultipartConfig并删除Apache Commons FileUpload。

  3. 另见: