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

时间:2013-12-01 22:16:49

标签: playframework-2.0 playframework-2.1 playframework-2.2

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

<img src="@{Application.getImage()}"/>

我的应用程序控制器:

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");  
}

在生成的HTML中我得到:

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

我找到了有关此主题的一些信息(onetwothreefour),
但它通常与旧版本或Scala版本的游戏有关 请提出任何建议或指出我的错误,
感谢

3 个答案:

答案 0 :(得分: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");
}

路线档案:

GET     /entity/image/:id       controllers.Entities.getImage(id:Long)

观点:

<img src=@{routes.Entities.getImage(entity.getId())}>

答案 1 :(得分:2)

虽然可以将图像直接嵌入到HTML文档中,但并非所有浏览器都支持它。为此,您需要将图像编码为Base64。编码后生成的图像比正常使用时的图像大33%,并且不会被缓存,因此除非图像非常小,否则您的性能会比提供图像更差一般。我之前使用过这个表情符号和其他非常小的图形。我不会将它用于任何更大的东西。

您可以在此处阅读有关优缺点的更多信息:

Should I embed images as data/base64 in CSS or HTML

要实现这一点,您需要编写一个返回String而不是Result的方法,并且String需要看起来像这样:

data:image/jpg;base64,<base64 encoded image here>

答案 2 :(得分:1)

您应该在getImage()属性中使用Result行动的路线而非其src

<img src='@routes.Application.getImage()'/>
BTW:虽然我们不知道你对图像做了什么样的操作,但有时将它们保存到光盘是有意义的 - 特别是如果它们有可能被重用。在这种情况下,您可以使用以下命令返回:

return ok(new File("/path/to/file"));

当然仍然使用route作为src;)