如果在发送包含zip文件的httpresponse时未指定contentLenght头,会发生什么情况。
我做了一些测试,似乎在默认情况下,头是用正确的文件长度设置的。
我能确定这总是发生吗?我什么时候能找到有关的文件?
这是代码中最重要的部分:

    response.setContentType("application/zip");
            response.addHeader("Content-disposition", "attachment; filename=" + zipFileName);
        zos.close();
        out.close();
        response.flushBuffer();

达维德

最佳答案

如果实际的响应内容长度完全适合响应缓冲区(通常为2kb)(这取决于服务器make/version/config),那么将设置内容长度头。但是,如果实际的响应内容长度大于响应缓冲区,以便在到达响应内容的末尾之前刷新它,那么servlet将使用chunked encoding发送响应,并忽略设置内容长度头的任何尝试。
下面引用的javadoc中提到了这一点:

在可能的情况下,设置内容长度头(使用HttpServlet#doGet()方法),以允许servlet容器使用持久连接将其响应返回给客户端,从而提高性能。如果整个响应适合响应缓冲区,则自动设置内容长度。
使用http 1.1分块编码(这意味着响应具有传输编码头)时,不要设置内容长度头。

使用“正常”编码,数据作为一个连续块发送。

actualContent

使用分块编码,数据以如下所示的分块发送
part1LengthInHexadecimal
actualPart1Content

part2LengthInHexadecimal
actualPart2Content

part3LengthInHexadecimal
actualPart3Content

0

十六进制的部分长度表示客户机下一个数据块有多大(这样它就不会“意外”地”将下一个数据块作为当前数据块的一部分进行分析)。最后,客户把零件粘在一起。
另请参见ServletResponse.setContentLength(int)中的示例。

关于http - Java Servlet HttpResponse contentLenght header ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14381825/

10-12 05:11