Playframework 2.0 播放框架2显示来自数据库或外部资源的图像

Playframework 2.0 播放框架2显示来自数据库或外部资源的图像,playframework-2.0,playframework-2.1,multipart,Playframework 2.0,Playframework 2.1,Multipart,我在显示从外部存储检索到的图像时遇到了实际问题,在本例中是S3,但很容易成为数据库 我的问题是如何显示不在文件系统上的图像,即它们是对象中的文件/图像。我正在使用Play 2.1.1 看法 控制器(我在这里尝试了许多选项,但这似乎是其他人使用的) } 如果我查看未显示的图像的生成输出,我会看到: <img src="SimpleResult(200, Map(Content-Type -&gt; image/jpeg))"> 你花了很多时间试图解决一个问题,提出一个问题,几

我在显示从外部存储检索到的图像时遇到了实际问题,在本例中是S3,但很容易成为数据库

我的问题是如何显示不在文件系统上的图像,即它们是对象中的文件/图像。我正在使用Play 2.1.1

看法

控制器(我在这里尝试了许多选项,但这似乎是其他人使用的)

}

如果我查看未显示的图像的生成输出,我会看到:

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

你花了很多时间试图解决一个问题,提出一个问题,几分钟后再解决

我做了两个更改,一个是路由,一个是控制器

路线

<h3><img src="@controllers.Application.getImage(image.getId)" /></h3>
changed to 
<h3><img src="@routes.Application.getImage(image.getId)" /></h3>

这样做会浪费大量的资源,因为您需要将文件从存储传输到应用程序,然后将其重写为输出,最后发送到客户端。这些操作中的每一项都会产生一些成本,并且是多余的

相反,您应该使用直接链接在<代码> SRC属性中进行文件,另外在本地DB上考虑缓存桶的文件名,这样您就不必每次询问S3的路径……/P> 可能是这样的:

<img src="@utils.MyS3.getImagePath(image.getId)" />


其中
getImagePath
方法只返回类似
http://s3.amazonaws.com/mybucket/myfile.jpg
通过id从数据库/缓存中解析。

感谢您的建议,我刚刚测试了图像存储策略,因为我不想将它们存储在数据库中。我想s3会是一个更便宜的选择,因为我打算在AWS上运行这个应用程序。我会尝试你的建议,但我也可能恢复到在文件系统上存储S3或Dynamo db中的备份
<img src="SimpleResult(200, Map(Content-Type -&gt; image/jpeg))">
<h3><img src="@controllers.Application.getImage(image.getId)" /></h3>
changed to 
<h3><img src="@routes.Application.getImage(image.getId)" /></h3>
    public static Result getImage(final String id) {
      try {
        ImageId imageId = AWS_S3_SERVICE.getImage(id);
        BufferedImage image = ImageIO.read(imageId.image);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "jpg", baos);

        return ok(baos.toByteArray()).as("image/jpg");
      } catch (Exception ex) {
        ex.printStackTrace();
      }
      return ok();
    }
<img src="@utils.MyS3.getImagePath(image.getId)" />