设置 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()
时发送
今天,我尝试编写用于下载 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()