2014-02-24 24 views
3

我需要计算写入HttpServletResponse的实际字节数以确保整个文件已被传输。我天真的做法是这样的:计算写入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(); 

虽然这种方法效果很好的码头,Tomcat的总是返回写入完整的OutputStream,即使客户已经取消了下载。我们现在不得不迁移到Tomcat 7并遇到这个问题。

有没有一种方法可以计算实际发送给客户端的字节数?

+0

尝试'字节[]字节= IOUtils.toByteArray(的inputStream);' –

+0

这可能是可能的Tomcat 7(或在之间的一些其他服务器)是缓冲在将其发送到客户端之前的输出 – JoseM

+0

@Suzon这会导致流缓冲在byte []中。我们正在传输2GB的文件。所以如果它能工作的话,这将不会表现的很好。 – Randy

回答

0

还有,你要调查几件事情:

  1. 是内容长度标头中提供?否则,tomcat将缓存整个响应
  2. 确保容器配置为支持分块编码。
  3. 确保客户端支持分块编码(它不是HTTP 1.0)

另一件事是,tomcat的串流基础7.0.27版本后,遭遇了大规模的重构与WebSockets的实现。有关详细信息,看看这里:

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

+0

内容长度设置正确,客户端和服务器都支持分块编码。 – Randy