我有 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);
}