今天,我尝试编写下载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,我可以在标题中以Content-Length:232下载它。
但是,当我下载大小为8,392,236字节的较大版本时,我也可以下载它。但我没有从响应标题中获取Content-Length?
如何帮助查看问题是什么?响应标头中的内容长度是否有限制?
答案 0 :(得分:1)
Content-Length信息是HTTP响应头字段的一部分。在TCP连接上,它们首先从服务器发送到客户端。
一旦服务器开始编写响应的实体主体,服务器就无法在HTTP协议中将内容长度信息传输到客户端。
两个示例之间的区别在于较小的内容仍然适合servlet容器的响应实现的缓冲区。因此它可以在任何内容字节之前发送内容长度。响应正文仅在以下对flushBuffer()