2 个 servlet,一个在响应中获取内容长度,一个没有



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

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

我一直无法弄清楚我能做些什么来造成这种差异。

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

只是为了它,我确实尝试使用响应。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! 当然,在大文件完全流式传输之前,它无法设置内容长度 - 并且由于它是分段流式传输的,因此在收到回复时不知道内容长度。我的addIntHeader()不起作用的原因是它是在文件流式传输后完成的,因此响应很久以前就已经发送了。

最新更新