从JAX-RS servlet动态创建图像

5

能否在JAX-RS资源的一部分中创建PNG图像并直接将其输出到浏览器?

类似于这样:

@Path("img/{externalId}")
@Stateless
@Produces({"image/png"})
public class MyImgResource {

  @GET
  public Response (@PathParam("externalId") String externalId) {
    // create image, write to buffered output stream

    return Response.ok().entity(stream).build();
  }
}

这个方案可行吗?我需要注意正确的头信息(Content-Type),还是由@Produces注解完成?能够将图像作为Response输出吗?我能否从流中构建一个Response

1个回答

9
请看http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e323
 @GET
 @Path("/images/{image}")
 @Produces("image/*")
 public Response getImage(@PathParam("image") String image) {
     File f = new File(image);

     if (!f.exists()) {
         throw new WebApplicationException(404);
     }

     String mt = new MimetypesFileTypeMap().getContentType(f);
     return Response.ok(f, mt).build();
 }

1
谢谢。我通过创建Image到ByteOutputStream并从中构建Response来类似地完成了它。 - Hank
3
您可以从资源方法中返回任何 InputStream 实现,您的 JAX-RS 实现应该能够处理它。 - dweomer
2
@Hank,提前将图像读取为ByteArray会浪费内存。对于大型图像,这将导致内存管理问题。最好返回一个InputStream,让容器负责将流传输给调用者。 - Isaac
@Isaac,完全正确,我非常同意(现在有更多的经验)。 - Hank
@Isaac 你是指像这样吗?return new BufferedInputStream(new FileInputStream("source.png")); - Socrates
1
@苏格拉底确实。 - Isaac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接