0

我有一个接收上传文件的 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变量包含上传的文件。

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

4

1 回答 1

2

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

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

这是使用 Servlet 3.0 上传文件的示例

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

Servlet 3.0 文件上传参考:

于 2012-07-10T05:01:45.530 回答