Java 2个servlet,一个在响应中获取内容长度,另一个不';T

Java 2个servlet,一个在响应中获取内容长度,另一个不';T,java,servlets,http-headers,http-content-length,Java,Servlets,Http Headers,Http Content Length,我有两个不同的servlet,都在处理POST调用,结果都是流式传输文件。 一个总是以内容长度标题结束,另一个永远不会。 它们都使用javax.servlet.http.HttpServletResponse 两者都设置“内容类型”=“应用程序/八位字节流” 我还没有弄清楚我能做些什么来造成这种差异 我在处理过程中看到的唯一真正区别是,没有获取内容长度的文件的大小通常是多MB,而另一个文件的大小通常只有几KB 只是为了见鬼,我尝试了使用response.AddHeader(“thing”,siz

我有两个不同的servlet,都在处理POST调用,结果都是流式传输文件。 一个总是以内容长度标题结束,另一个永远不会。 它们都使用javax.servlet.http.HttpServletResponse

两者都设置“内容类型”=“应用程序/八位字节流”

我还没有弄清楚我能做些什么来造成这种差异

我在处理过程中看到的唯一真正区别是,没有获取内容长度的文件的大小通常是多MB,而另一个文件的大小通常只有几KB

只是为了见鬼,我尝试了使用response.AddHeader(“thing”,size),并注意到这两个servlet都没有显示该头

注意,我在OS/X机器上接收文件,并使用[NSHTTPURLResponse allHeaders]查看响应头

下面是一些经过大量精简的代码。基本上只保留反映响应的内容:

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("application/octet-stream");
    resp.setBufferSize(256 * 1024);
    OutputStream rout = resp.getOutputStream();
// lots of work getting the stream
// Also left out all the exception handling and error checking
    IOUtils.copy(datafile, rout);
    rout.close();
    resp.addIntHeader("OnDeck-Test", 555);
  }

我有一个DOH!几分钟后。当然,它不能在大文件完全流式传输之前设置内容长度,而且因为它是以片段流式传输的,所以在收到回复时,内容长度就不知道了。
我的AddInHeader()不起作用的原因是它是在文件流传输之后完成的,因此响应很久以前就已经发送了。

它如何知道内容长度以便在标题中设置它?