【问题标题】:How to return image as stream from JAX-RS?如何从 JAX-RS 将图像作为流返回?
【发布时间】:2012-08-24 21:14:59
【问题描述】:

我正在尝试在 JAX-RS Web 服务中返回图像。我可以通过返回 FileInputStream 来成功完成这项工作,但我更愿意避免为每个请求创建一个 File

我正在使用 Apache CXF 和 Jackson(所有其他资源方法都生成 application/json)。

代码如下:

@GET
@Produces("image/png")
public Response getQrCode(@QueryParam("qrtext") String qrtext) {

    ByteArrayOutputStream out = QRCode.from(qrtext).to(ImageType.PNG).stream();

    return Response.ok(out).build();
}

不幸的是,这产生了可怕的:

org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor:376 - 没有消息 已找到响应类 ByteArrayOutputStream 的正文编写器。

Here's 一个类似帖子的链接,但它没有提到我遇到的“没有消息正文作者”问题。

对于如何处理此问题的任何想法,我将不胜感激。谢谢!

【问题讨论】:

  • 为什么不直接返回流而不是将其包装在响应中?

标签: cxf jax-rs jackson


【解决方案1】:

只需使用StreamingOutput 包装器。出于某种原因,它是未知的,但它非常适合提供流输出。 :-)

【讨论】:

  • 谢谢大图。返回 StreamingOutput 比直接返回字节数组作为 Response 实体更可取?
  • 像往常一样,“这取决于”。如果你已经有byte[],那可能没什么区别。
  • 对流使用 toByteArray 通常是个坏主意,因为这基本上会将整个流放在内存中。因此,如果您的文件为 1GB,则 JVM 中至少需要 1GB。如果有多个用户访问您的服务,每个用户将额外增加 1GB,这将导致您的服务器停机。我总是建议直接使用流。
【解决方案2】:

我认为您需要在 Response.ok(out) 中提供包含图像的 InputStream,而不是 OutputStream。 (您的 JAX-RS 框架会从 InputStream 中读取字节并将它们放入响应中,它通常无法对 OutputStream 执行任何操作)

(我知道您在使用 CXF,但 Jersey 的文档:http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e324 并且根据 JAX-RS 规范,框架必须为 InputStream 提供 MessageBodyWriter。)

编辑:您显然知道 InputStreams 是必需的,哦...您可以控制 QRCode 类吗?

短期内,你或许可以做到:

return Response.ok(out.toByteArray()).build();

【讨论】:

  • 谢谢。你的回答是一个很大的帮助。 Response.ok(out.toByteArray()).build() 效果很好。
猜你喜欢
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多