- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试实现一个用于流式传输大对象的 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/
我正在使用 Tomcat。 ServletResponse.flushBuffer 的文档说,“强制将缓冲区中的任何内容写入客户端。调用此方法会自动提交响应,这意味着状态代码和 header 将是写的
我正在尝试实现一个用于流式传输大对象的 servlet: oracle.sql.BLOB blob = rs.getBLOB('obj'); InputStream in = blob
如果我调用 ServletResponse.flushBuffer() , 我需要打电话吗 ServletResponse.getOutputStream().close() 和/或 ServletR
我使用以下 REST 处理程序将文件传输到客户端。 我故意调用了response.flushBuffer(),希望我应该被阻止写入响应,因为它已经提交。我希望客户不会收到完整的文件。 但整个文件仍会发
我正在开发一个返回一些 JSON 对象的 servlet,当我从浏览器调用这个 servlet 时,一切正常,当字体端开发人员从 JavaScript 调用它时,在 4 或 5 个请求后抛出这个异常:
我必须将数据从 jqdrid 导出到 Excel 文件。我可以在我的 JavaScript 代码中准备字符串格式的数据,如下所示 "1\tRamu Kaka\tShanta Ben\tN Modi\t
调用有什么区别: res.flushBuffer(); 对比 res.getOutputStream().flush(); 这些方法是否刷新相同的缓冲区? 如果是这样,你能告诉我这个缓冲区是如何由
当我从部署到 Tomcat 8 的 Spring Boot WAR 应用程序中写出 JSON 时,我遇到了并发问题。在 AppDynamics 的屏幕截图中,当 jackson 库执行 _flushB
我是一名优秀的程序员,十分优秀!