gpt4 book ai didi

java - response.flushBuffer() 不工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:31 24 4
gpt4 key购买 nike

我正在尝试实现一个用于流式传输大对象的 servlet:

    oracle.sql.BLOB blob = rs.getBLOB('obj');
InputStream in = blob.getBinaryStream();

int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];

ServletOutputStream out = response.getOutputStream();

int counter=0
while((length=in.read(buffer)) != -1){
out.write(buffer,0,length);
counter++;
if(counter % 10 == 0){
counter=0;
response.flushBuffer();
}

此代码假设通过 chunk 将数据发送到客户端 block 。现在发生的事情是,当我流式传输大对象 (100 MB) 时,内存会增加,如果有多个并行下载/流,服务器有时会死机。

为什么这个 flushBuffer() 没有向客户端发送数据?只有在响应关闭后,客户端才会弹出打开/保存文件的提示。

最佳答案

您必须在写入数据之前设置Content-Length header ,否则服务器将被迫缓冲所有数据,直到流关闭,此时它可以自行计算值,写标题,并发送所有数据。一旦获得输出流,在写入任何数据之前,设置内容长度:

response.setHeader("Content-Length", String.valueOf(blob.length()));

大多数服务器都足够智能,可以在此时自行刷新缓冲区,因此您可能甚至不需要调用 flushBuffer() —— 虽然这不会造成伤害。

关于java - response.flushBuffer() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10552555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com