设置 Servlet 响应内容长度失败

Set Servlet Response Content Length Failed

今天,我尝试编写用于下载 zip 文件的代码。但是,我发现了一个棘手的问题?

HttpServletResponse response

...

response.setContentType("application/zip");
response.setHeader("Content-Disposition", String.format("attachment; filename=myzipfile-" + new Date().getTime() + ".zip"));

File file = new File(somePath);
InputStream inputStream = new FileInputStream(file);
IOUtils.copy(inputStream, response.getOutputStream());
inputStream.close();

response.setContentLengthLong(file.length());
response.flushBuffer();

然后,我尝试下载两个文件,第一个文件的大小是232,我可以在header.

中用Content-Length:232下载它

但是,当我下载较大的8,392,236字节时,我也可以下载。但是我没能从响应 header?

中得到 Content-Length

请问各位帮忙看看是什么问题?响应中的内容长度是否有限制 header?

Content-Length 信息是 HTTP 响应 header 字段的一部分。在 TCP 连接上,它们首先从服务器发送到客户端。

一旦服务器开始写入响应的实体 body,HTTP 协议就无法让服务器将内容长度信息传输给客户端。

您的两个示例之间的区别在于较小的内容仍然适合您的 servlet 容器的响应实现的缓冲区。因此它可以在任何内容字节之前发送内容长度。响应 body 仅在以下调用 flushBuffer()

时发送