@GET
@Path("/{id}/content")
@Produces({ "application/octet-stream" })
public Response getDocumentContentById(@PathParam("id") String docId) {
InputStream is = getDocumentStream(); // some method which gives stream
ResponseBuilder responseBuilder = Response.ok(is);
responseBuilder.header("Content-Disposition", "attachment; filename=" + fileName);
return responseBuilder.build();
}
这里我如何关闭InputStream?如果某事(jax.rs)自动关闭。请给我一些信息。谢谢。
答案 0 :(得分:2)
当您想要流式传输自定义响应时,我发现的最可靠的方法是返回包含InputStream
的对象(或者可以通过其他方式获取流的对象)在某些时候),并定义一个MessageBodyWriter
提供商,它将在适当的时间进行实际的流式传输。
例如,this code是Apache Taverna的一部分,它会流回目录的压缩内容。主代码使用它所需要做的就是返回ZipStream
作为响应(可以打包在Response
中),并确保它正在处理返回{{ 1}}内容类型。最后要注意的是,由于这是处理CXF,您需要手动注册提供程序;与Glassfish不同,它们不会被自动拾取。在复杂的场景中这是一件好事,但它确实意味着您需要进行注册。