【问题标题】:Lose HttpServletRequest Parts After Reading Them阅读后丢失 HttpServletRequest 部分
【发布时间】:2012-07-09 21:19:31
【问题描述】:

我有一个接收上传文件的 servlet。我们一直遇到某个客户的请求没有附加文件或 servlet 认为的问题。上传 servlet 是旧 servlet 的替代品,我们使用 Apache Commons FileUpload 库从请求中解析文件。旧代码使用 JavaZoom 库。我们遇到问题的请求客户端在旧代码中工作得非常好。

为了解决问题,我添加了一堆日志记录来查看请求标头和部分,以比较来自客户端的请求与不工作的客户端的请求。这是我对零件的看法:

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 变量在记录时为空。如果我注释掉记录请求部分的代码,这段代码就可以工作,items 变量包含上传的文件。

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

【问题讨论】:

    标签: servlets java-ee-6 httprequest multipartform-data


    【解决方案1】:

    Collection&lt;Part&gt; parts = request.getParts(); 是一个 Sevlet 3.0 API,它替代了Commons Apache File Upload API

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

    这是File Upload Using Servlet 3.0 的示例

    您面临的问题是因为您正在调用此Collection&lt;Part&gt; parts = request.getParts(); 请求将消耗请求输入流。然后您正在使用 Apache Commons API 再次阅读这些部分。因为流已经被读取,所以您没有看到可用的部分。

    Servlet 3.0 文件上传参考:

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 2017-11-23
      • 2013-08-31
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2017-08-24
      相关资源
      最近更新 更多