2012-07-09 83 views
0

我有一个接收上传文件的servlet。我们遇到了某个客户的请求没有附加文件或servlet认为的问题。上传servlet替代了旧的servlet,我们使用Apache Commons FileUpload库从请求中解析文件。旧代码使用JavaZoom库。我们遇到的请求客户端在旧代码中工作得很好。读取它们后丢失HttpServletRequest部件

为了解决问题,我添加了一堆日志记录来查看请求标头和部分,以比较来自客户端的请求与不支持的客户端的请求。这是我在看部件的一个片段:

Collection<Part> parts = request.getParts(); 

for(Part part : parts)     
{ 
    String partName = part.getName(); 

    log.debug("Part=" + partName); 

    Collection<String> headerNames = part.getHeaderNames(); 

    for(String headerName : headerNames) 
    { 
     String headerValue = part.getHeader(headerName);      
     log.debug(headerName + "=" + headerValue); 

     InputStream inputStream = part.getInputStream();      
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); 
     StringBuilder builder = new StringBuilder(); 

     try 
     { 
      for(String line=bufferedReader.readLine(); line!=null; line=bufferedReader.readLine()) 
      { 
       builder.append(line); 
       builder.append('\n'); 
      } 
     } 

     catch (IOException ignore) 
     { 
      // empty 
     } 
     finally 
     { 
      inputStream.reset(); 
     } 

     log.debug("InputStream=" + builder.toString()); 
    } 
} 

所有这些代码工作正常,我得到我期待的日志记录。然而,这个代码下位不作为的预期:当它登陆

if (isMultipart) 
{ 
    // Create a factory for disk-based file items 
    FileItemFactory factory = new DiskFileItemFactory(); 

    // Create a new file upload handler 
    ServletFileUpload upload = new ServletFileUpload(factory); 

    @SuppressWarnings("rawtypes") 
    List items = null; 

    // Parse the request 
    try 
    { 
     items = upload.parseRequest(request); 
     log.debug("items=" + items); 
    } 
    catch (FileUploadException ex) 
    { 
     log.warn("Error parsing request", ex); 
     response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage()); 
    } 

items变量是空的。如果我将用于记录请求部分的代码注释掉,则此位代码有效,并且变量包含上载的文件。

我只能假设从请求中获取/读取零件的行为以某种方式将它们从中移除并不再用于进一步处理。是否有某种方法可以将它们读取以用于日志记录,并仍将它们保留在进一步处理的请求中?

回答

2

Collection<Part> parts = request.getParts();是一个Sevlet 3.0 API,代替Commons Apache File Upload API

您应该只使用这两种方法中的一种。两者都支持处理上传的文件和参数。

这里是File Upload Using Servlet 3.0

实施例您正在面临的问题是,因为要调用此Collection<Part> parts = request.getParts();请求将消耗请求输入流。然后你使用Apache Commons API再次读取这些部分。由于流已经被读取,因此您看不到任何部件可用。

参考的Servlet 3.0文件上传: