我在jetty服务器部署中有一个处理程序,它引用了HttpServletResponse对象。
我正在将字节内容写入 Response.getOutputStream() ,如下所示:
ServletOutputStream serlvetOutputStream = handlerContext.getResponse().getOutputStream();
...
while(condition) {
//read chunk from some source into byteBuffer
servletOutputStream.write(byteBuffer, 0, lengthRead);
}
但是在我可以编写 write() 之前,我必须设置 http 客户端在响应中期望的内容长度:
handlerContext.getResponse().setContentLength((int) length); //or as below
handlerContext.getResponse().addHeader("Content-Length", String.valueOf(length));
在写入输出流之前未能设置长度,会导致 Windows 客户端应用程序上出现“错误文件大小未知”弹出框。但有些时候,我直到事后才知道要写的长度。我无法预先累积要读取的整个数据(因为它可能会使客户端超时以获取较大的数据),因此必须将其“分块”,即读取 x 千字节,然后写入 x 千字节,直到条件为 false。
我的问题是 - 有没有办法在写入之前动态更新内容长度?在上面的循环中,我想将内容长度设置为可写入的字节数,write() 这些字节,然后在循环时再次更新它。
如果我更新循环内的内容长度,我会得到 jetty.server.EoFException。
最佳答案
您不需要设置内容长度。它会自动发生。这里有一个 XY 问题。您遇到未公开的异常,并且您认为设置内容长度可以解决该问题。但是,由于您也无法设置内容长度,因此您的信念的实际证据为零。
关于java - 写入 http 响应对象的 OutputStream 后设置内容长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41437888/