写入其OutputStream后,在http响应对象中设置内容长度

时间:2017-01-03 06:46:43

标签: java http servlets httpresponse embedded-jetty

我在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客户端应用程序上的弹出框。但在某些情况下,我不知道在此之前要写的长度是多少。我无法预先累积要读取的整个数据(因为它可能会使客户端超时以获取更大的数据)所以它必须是“chunked”#34;即读取x千字节,然后写入x千字节,直到条件为假。

我的问题是 - 有没有办法在写作之前动态更新内容长度?在上面的循环中,我想设置内容长度,因为有许多字节可用于写入,写入()那些,然后在循环时再次更新它。

如果我在循环中更新内容长度,我会得到jetty.server.EoFexception。

1 个答案:

答案 0 :(得分:2)

您不需要设置内容长度。它会自动发生。你在这里有一个XY问题。您有一个未公开的例外,并且认为设置内容长度将解决它。但是,由于您无法设置内容长度,因此您的信念没有实际证据。