java - 如何从RESTful Web服务发送图像?

时间:2017-01-28 04:05:09

标签: java image rest server

我正在 Java 上实现 Restful Web Service ,没有框架。我的想法是从文件服务器发送图像,因为将它们存储在数据库中会降低服务器的速度。到目前为止,我有以下代码,它返回json内容:

@Path("articulo")
public class ArticuloResource {

    @Context
    private UriInfo context;
    private final ArticuloService service;
    private final Gson gson;

    /**
     * Creates a new instance of ArticuloResource
     */
    public ArticuloResource() {
        this.service = new ArticuloService();
        this.gson = new Gson();
    }

    /**
     * Retrieves representation of an instance of ArticuloResource
     * @return an instance of com.tienda.rest.pojo.Articulo
     */
    @GET
    @Produces(Metodos.Parametros.TYPE_APPLICATION_JSON)
    public String getJson() {
        return this.gson.toJson(this.service.seleccionarTodo());
    }    

    @GET
    @Path("novedades")
    @Produces(Metodos.Parametros.TYPE_APPLICATION_JSON)
    public String getNovedades() {
        return "Novedades";
    }

    @GET
    @Path("{id}")
    @Produces(Metodos.Parametros.TYPE_APPLICATION_JSON)
    public String getArticulo(@PathParam("id") Integer id) {
        return this.gson.toJson(this.service.getUnique(id));
    }

    /**
     * PUT method for updating or creating an instance of ArticuloResource
     * @param content representation for the resource
     * @return an HTTP response with content of the updated or created resource.
     */
    @PUT
    @Consumes(Metodos.Parametros.TYPE_APPLICATION_JSON)
    public void putJson(Articulo content) {
    }

    @GET
    @Produces(Metodos.Parametros.TYPE_IMAGE_PNG)
    public Response getImage() {
        return null;
    }
}

想法?提前谢谢。

2 个答案:

答案 0 :(得分:1)

请尝试以下操作:

class Keeper:

    # constructor, requires a 3-D array
    def __init__(self, third_dim):
        self.x = []
        self.y = []
        if third_dim.ndim == 3:
            for row in third_dim:
                for col in row:
                    self.x.append(col[0])
                    self.y.append(col[1])

您可以尝试流式传输图像。它可能会好一点。 @GET @Produces(Metodos.Parametros.TYPE_IMAGE_PNG) public Response getImage() { byte[] bytes = Files.toByteArray("file.png"); return Response.ok(bytes).build(); }

然而,不管你选择哪个选项,它都会有点慢。您可以将重定向链接发送到另一台服务器,该服务器可以独立于您的应用服务器将图像传送到客户端。它比发送图像本身更好。

答案 1 :(得分:0)

有一种解决方法,但这取决于您用于存储图像的文件服务器。

如果是Windows文件服务器或S3,您可以从REST服务返回图像的链接。在html页面中,您可以使用from Tkinter import * import time ventana = Tk() v = StringVar() v.set("30") def temporizador(): counter = 29 if counter <= 0: v.set("tiempo") else: v.set(str(counter)) counter -= 1 ventana.after(1000, temporizador) etiqueta = Label(ventana, textvariable = v) etiqueta.pack() boton = Button(ventana, text="Empezar", command = temporizador) boton.pack() ventana.mainloop() 。但是(对于Windows文件服务器)这适用于DMZ,而不是客户端的外部n / w。

如果应用程序要暴露给外部世界(DMZ外部),那么您的REST服务应该吐出字节数组。 顺便说一句,这不应该大大减慢您的服务器速度。