java - 写入 http 响应对象的 OutputStream 后设置内容长度

标签 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 客户端应用程序上出现“错误文件大小未知”弹出框。但有些时候,我直到事后才知道要写的长度。我无法预先累积要读取的整个数据(因为它可能会使客户端超时以获取较大的数据),因此必须将其“分块”,即读取 x 千字节,然后写入 x 千字节,直到条件为 false。

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

如果我更新循环内的内容长度,我会得到 jetty.server.EoFException。

最佳答案

您不需要设置内容长度。它会自动发生。这里有一个 XY 问题。您遇到未公开的异常,并且您认为设置内容长度可以解决该问题。但是,由于您也无法设置内容长度,因此您的信念的实际证据为零。

关于java - 写入 http 响应对象的 OutputStream 后设置内容长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41437888/

相关文章:

c - 在 c 中编写一个具有连接持久性支持的 http 服务器

Python 相当于 Perl 的 HTTP::Async->next_response

java - 通过 Java 使用来自 http ://www. webservicex.net 的 Web 服务

java - Elasticsearch自定义插件: Add extra query parameter before search

php - 如何测试 "If-Modified-Since"HTTP header 支持

java - 在 .war 文件下创建一个 java-properties 文件

java - 如何使用 servlet 运行 Freemarker 模板?

java - Camel 组件测试中的"unable to find valid certification path to requested target"

java - 如何按顺序多次运行 jbehave 场景

java - Spring Data MongoDB addToSet() 与复杂对象