计算写入tomcat HttpServletResponse的实际字节数

时间:2014-02-24 14:46:13

标签: java tomcat

我需要计算写入HttpServletResponse的实际字节数,以确保整个文件已被传输。我天真的做法是这样的:

            InputStream instream = InputStream instream = new FileInputStream("myfile.zip");
            ServletOutputStream outputStream = res.getOutputStream();

            CountingInputStream countingInputStream = new CountingInputStream(instream);
            IOUtils.copy(countingInputStream, outputStream);

            log.debug("Expected count: " + String.valueOf(contentLength));
            log.debug("getCount: " + countingInputStream.getCount());

            outputStream.close();
            countingInputStream.close();
            instream.close();

虽然这种方法在Jetty上运行良好,但Tomcat总是返回要写入的完整输出流,即使客户端已取消下载。

此外,这在Tomcat 6上也运行良好多年。我们现在不得不迁移到Tomcat 7并遇到了这个问题。

有没有办法计算实际发送到客户端的字节数?

1 个答案:

答案 0 :(得分:0)

您需要调查几件事情:

  1. 是否提供了内容长度标题?如果没有,tomcat将缓存整个响应
  2. 确保将容器配置为支持分块编码。
  3. 确保客户端支持分块编码(不是HTTP 1.0)
  4. 另一件事是,在版本7.0.27之后,tomcat流式基础架构遭受了对websockets实现的重大重构。有关详细信息,请查看此处:

    http://www.tomcatexpert.com/blog/2012/05/01/how-apache-tomcat-implemented-websocket