- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
private void downloadAllRelease(HttpServletRequest request,
HttpServletResponse response) {
LoginToken tok=getToken(request, response);
int size = 0;
try {
ArrayList<Release> releases = manager.getReleases(tok.getUsername);
ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
for (int i=0; i<releases.size(); i++) {
size += releases.get(i).getFile().length;
out.putNextEntry(new ZipEntry(releases.get(i).getFilename()));
out.write(releases.get(i).getFile());
out.closeEntry();
}
response.setContentLength(size);
response.setContentType("application/force-download");
response.setHeader("Content-Disposition","attachment;filename=release.zip");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
response.setContentLength()
确实减慢了下载速度。
如果我不使用它或将它放在 out.close()
之后,一切仍然正常,但下载速度要快得多。
谁能解释一下为什么以及是否有必要使用 response.setContentLength()
?
最佳答案
也许是因为您指定的大小比实际发送到响应的大小大,并且网络浏览器基本上感到困惑并正在等待更多数据?您知道,ZIP 压缩文件并减小最终大小。
如果您不能事先有效地计算它,就不要指定响应的内容长度。 servlet 容器将 automatically用 chunked encoding 发送反正。的确,这会产生更多的开销,并使网络浏览器的下载进度未知,但这并不需要您先在服务器内存中缓冲整个响应,以便您可以获得正确的最终响应内容长度。
如果您真的想要计算最终的响应内容长度,您需要将其全部写入ByteArrayOutputStream
,然后获取byte[ ]
通过其 toByteArray()
方法。真正的响应内容长度就是byte[]
的长度。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream out = new ZipOutputStream(baos);
// ...
response.setContentLength(baos.size());
response.getOutputStream().write(bytes);
这只是更多的内存占用,因为所有内容都将首先存储在服务器的内存中。如果多个用户同时执行此操作并且 zip 输出相对较大,那么您的服务器可能迟早会面临内存不足的风险。作为另一种选择,您可以使用 FileOutputStream
将其写入由 File#createTempFile()
创建的临时文件,以便您可以通过 File# 获取其大小length()
并使用 FileInputStream
以通常的方式将其直接流式传输到响应的 OutputStream
中。这只会更慢,因为您基本上要传输大约两次字节。
关于http - Servlet : response. setContentLength() 下载速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8797035/
当使用setContentLength方法设置比实际大小更大的响应长度时,为什么容器不自动计算长度? 例如, String s = "hello"; byte[] b = s.getBytes();
根据文档,ServletResponse 接口(interface)的setContentLength(int len) 方法设置响应中内容主体的长度 在 HTTP servlet 中,此方法设置HT
private void downloadAllRelease(HttpServletRequest request, HttpServletResponse response) {
如果在发送包含 zip 文件的 HttpServletResponse 时没有指定 Content-Length header 会怎样? 我做了一些测试,似乎标题默认设置为正确的文件长度。我能确定这总
本文整理了Java中org.apache.xmlrpc.client.XmlRpcHttpTransport.setContentLength()方法的一些代码示例,展示了XmlRpcHttpTran
我是一名优秀的程序员,十分优秀!