在浏览器中显示控制器中的图像对象

snp*_*p0k 4 playframework-2.0 playframework-2.1 playframework-2.2

我使用playframework 2.2.1和Java,
我试图传递BufferedImage或ByteArray或ByteArrayInputStream
来查看模板,以便直接从内存中显示在浏览器中,
而不保存到服务器存储.
在我的视图模板中,我请求一个图像:

<img src="@{Application.getImage()}"/>
Run Code Online (Sandbox Code Playgroud)

我的应用控制器:

public static Result getImage() throws IOException{  
    BufferedImage image = ImageIO.read(new File("public/img/1.jpg"));  
    //some image manipulations  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    ImageIO.write(image, "jpg", baos);  
    return ok(baos.toByteArray()).as("image/jpg");  
}
Run Code Online (Sandbox Code Playgroud)

在生成的HTML中我得到:

<img src="SimpleResult(200, Map(Content-Type -&gt; image/jpg))">
Run Code Online (Sandbox Code Playgroud)

我发现了一些关于这个主题的信息(,,,),
但它通常与旧版本或Scala版本的游戏有关.
请提出建议或指出我的错误,
谢谢

Ben*_*hik 10

对于字节数组图像,这是我的解决方案(基于stackoverflow中的其他解决方案):

控制者:

public static Result getImage(Long id) {
    Entity entity = Entity.find.byId(id);
    ByteArrayInputStream input = null;

    if (entity.getImage() != null) {
        input = new ByteArrayInputStream(entity.getImage());
    } else {
        try {
            byte[] byteArray;
            File file = Play.getFile("/public/images/no_photo.jpg", Play.current());
            byteArray = IOUtils.toByteArray(new FileInputStream(file));
            input = new ByteArrayInputStream(byteArray);
        } catch (Exception e) {

        }
    }

    return ok(input).as("image/jpeg");
}
Run Code Online (Sandbox Code Playgroud)

路线档案:

GET     /entity/image/:id       controllers.Entities.getImage(id:Long)
Run Code Online (Sandbox Code Playgroud)

风景:

<img src=@{routes.Entities.getImage(entity.getId())}>
Run Code Online (Sandbox Code Playgroud)


bie*_*ior 1

您应该使用操作路径getImage()而不是其Resultinsrc属性:

<img src='@routes.Application.getImage()'/>
Run Code Online (Sandbox Code Playgroud)

顺便说一句:虽然我们不知道您对图像进行了什么样的处理,但有时将它们保存到光盘上是有意义的 - 特别是当它们有可能被重复使用时。在这种情况下,您可以通过以下方式退货:

return ok(new File("/path/to/file"));
Run Code Online (Sandbox Code Playgroud)

当然仍然使用routeas src;)