【问题标题】:2 servlets, one gets a Content-Length in the response, one doesn't2 个 servlet,一个在响应中获得 Content-Length,一个没有
【发布时间】:2013-09-25 05:54:31
【问题描述】:

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

两者都设置“Content-Type”=“application/octet-stream”;

我无法弄清楚我可以做些什么来造成这种差异。

我在处理过程中看到的唯一真正区别是,没有获得 Content-Length 的文件的大小通常是几 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);
  }

【问题讨论】:

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

标签: java servlets http-headers http-content-length


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多