Servlets 读取HttpServletRequest部件后将其丢失

Servlets 读取HttpServletRequest部件后将其丢失,servlets,java-ee-6,httprequest,multipartform-data,Servlets,Java Ee 6,Httprequest,Multipartform Data,我有一个servlet,它接收上传的文件。我们遇到了一些问题,比如某个客户端的请求没有附加文件,或者servlet认为是这样。upload servlet是旧servlet的替代品,我们使用ApacheCommonsFileUpload库解析请求中的文件。旧代码使用JavaZoom库。我们遇到问题的请求客户端在旧代码中工作得非常好 为了解决这个问题,我添加了一系列日志来查看请求头和部分,以比较来自工作客户端和不工作客户端的请求。这是我如何看待这些部分的一个片段: Collection<Pa

我有一个servlet,它接收上传的文件。我们遇到了一些问题,比如某个客户端的请求没有附加文件,或者servlet认为是这样。upload servlet是旧servlet的替代品,我们使用ApacheCommonsFileUpload库解析请求中的文件。旧代码使用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());
    }
}
items
变量在记录时为空。如果我注释掉用于记录请求部分的代码,那么这段代码有效,
items
变量包含上传的文件

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

收集部件=请求.getParts()是一个Sevlet 3.0 API,它取代了Commons Apache File Upload API

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

下面是一个例子

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

Servlet 3.0文件上传参考:

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());
    }