【问题标题】:Unable to use ApacheCommons for fileupload if I annotate the servlet with MultipartConfig如果我使用 MultipartConfig 注释 servlet,则无法使用 ApacheCommons 进行文件上传
【发布时间】:2013-01-04 18:34:23
【问题描述】:

如果我用 @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
} 

上面sn-p中的语句:

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 来上传文件。

【问题讨论】:

  • 你使用哪个应用服务器/servlet容器?
  • @PhilippeMarschall tomcat 7

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


【解决方案1】:

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

你有两个选择:

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

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

另见:

【讨论】:

  • 我明白,我们不能同时使用两者,但我不明白为什么 apache commons fileupload 会得到一个空的请求正文?
  • 因为@MultipartConfig 已经解析过了。将请求正文可视化为InputStream。一旦你完全阅读了它,你就不能再阅读它了。您需要创建一个新的。换句话说,要达到你想要的效果,如果你想解析两次,最终用户基本上必须发送两次相同的 HTTP 请求。这没有任何意义。
  • 好的。现在明白了。谢谢
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2014-06-07
  • 2010-10-30
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多