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

Playframework 2.0 在浏览器中显示控制器中的图像对象,playframework-2.0,playframework-2.1,playframework-2.2,Playframework 2.0,Playframework 2.1,Playframework 2.2,我在Java中使用playframework 2.2.1, 我正在尝试传递BuffereImage或ByteArray或ByteArrayInputStream 要查看模板以便直接从内存在浏览器中显示它, 不保存到服务器存储。 在我的视图模板中,我请求图像: 我的应用程序控制器: public静态结果getImage()引发IOException{ BuffereImage image=ImageIO.read(新文件(“public/img/1.jpg”); //一些图像处理 ByteAr

我在Java中使用playframework 2.2.1,
我正在尝试传递BuffereImage或ByteArray或ByteArrayInputStream
要查看模板以便直接从内存在浏览器中显示它,
不保存到服务器存储。
在我的视图模板中,我请求图像:


我的应用程序控制器:

public静态结果getImage()引发IOException{
BuffereImage image=ImageIO.read(新文件(“public/img/1.jpg”);
//一些图像处理
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
ImageIO.write(图像,“jpg”,baos);
返回ok(baos.toByteArray()).as(“image/jpg”);
}
在生成的html中,我得到:


我找到了一些关于这个主题的信息(,,,,
但它通常与旧版本或Scala版本的play相关。
请提出任何建议或指出我的错误,

谢谢

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

您可以在此处阅读更多关于利弊的信息:

要实现这一点,您需要编写一个返回字符串而不是结果的方法,该字符串需要如下所示:

data:image/jpg;base64,<base64 encoded image here>
数据:图像/jpg;base64,

您应该在
src
属性中使用到
getImage()
操作的路由,而不是它的
结果

<img src='@routes.Application.getImage()'/>

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

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

控制员:

公共静态结果getImage(长id){
实体=实体.find.byId(id);
ByteArrayInputStream输入=null;
if(entity.getImage()!=null){
input=newbytearrayinputstream(entity.getImage());
}否则{
试一试{
字节[]字节数组;
File File=Play.getFile(“/public/images/no_photo.jpg”,Play.current());
byteArray=IOUtils.toByteArray(新文件输入流(文件));
输入=新的ByteArrayInputStream(byteArray);
}捕获(例外e){
}
}
返回ok(输入).as(“图像/jpeg”);
}
路由文件:

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



我不明白你想要实现什么。我建议遵循YAGNI的基本原则:“你不会需要它”,当它涉及到优化时。如果你不明白自己在做什么,这更有效,因为如果你不明白自己在做什么,你怎么能对这是否值得优化做出明智的判断呢?对我来说,这不起作用,但我改变了
ByteArrayInputStream=null
to
InputStream输入=null成功了。我使用
ByteArrayInputStream
获得异常,我在
ByteArrayInputStream
的构造函数上获得空指针异常。
GET     /entity/image/:id       controllers.Entities.getImage(id:Long)