我使用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 -> image/jpg))">
我找到了有关此主题的一些信息(one,two,three,four),
但它通常与旧版本或Scala版本的游戏有关
请提出任何建议或指出我的错误,
感谢
答案 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
;)