在Play中显示动态图像!框架模板

时间:2014-03-16 13:58:50

标签: image scala playframework amazon-s3 playframework-2.0

我正在创建一个Play 2.2应用程序,根据URL,我需要从S3检索图像并将其呈现给用户。

我知道我可以在获得图像后立即渲染图像,但我想将其嵌入到网页中,以便我可以将其居中并在必要时显示更多信息。

我看到两种可能的选择:

选项A:

  • 将图像的网址从S3返回到模板,只需在img src标记内使用
  • 这将是一个简单的解决方案,并且具有高效性,因为我不必通过我的应用程序传递它
  • 但是,我无法控制图像。如果我想调整大小,或进行任何其他处理,那是不可能的,这是不太理想的。

选项B:首选方法

  • 从控制器中的S3中检索图像,将其作为参数传递给模板并将其呈现在图像标记内
  • 我无法弄清楚如何让它发挥作用,但它会是首选
  • 我可以调整图像大小并确保图像安全"显示

第二种选择可能吗?如果是这样,这是一种可接受的方法,还是性能不值得呢?

1 个答案:

答案 0 :(得分:1)

免责声明:无论如何,有可能因为您的问题是“基于意见” - 答案也只是一个建议(或者说是建议的一部分)。

首先,使用一些图形库来处理图像,即我们正在使用当前GraphicsMagick (GM) + gm4java(对不起,不知道什么是Scala的正确库)文件裁剪,快速,漂亮,按预期完成工作。

在我们的情况下,我们需要避免向未经授权的用户显示原始/裁剪图像的可能性,因此我们在检查访问权限后使用Play return ok(new File(path))返回它,但对于公共资产,您也可以使用ie一些HTTP服务器,它只处理传送图像,甚至将裁剪后的图像发送回S3,然后直接在src属性中使用它的URL。

方法很简单:

  • 有一些Play动作可以获取原始文件的路径(可以已翻译与S3 API一起使用)的参数
  • 从S3获取 origin 文件(如果需要)并将其保存在本地HDD上以进一步处理可能性
  • 使用GM处理文件,即裁剪并调整大小,然后将其保存到本地硬盘或发送到具有唯一名称的S3的特殊存储桶/文件夹
  • 最后,它返回文件路径(在S3 / HDD上)或操作(有限制),将返回此生成的文件。
  • 您可以在操作后立即删除原产地本地副本,但也可以将其留在那里以获取其他选项(至少在一段时间内) - 然后使用ie scheduler清除来源超过X天

请记住,相当糟糕(表示:缓慢且昂贵的)选项可以将S3文件提取到Play应用并在每次请求裁剪版本时进行处理,因此需要添加一些额外的HDD空间在您的定价计划中,尽可能在目标计算机上保留originscropped

同样提示:从结果缩略图中删除color profile(使用GM)会降低其大小,这样您就可以节省额外的美元转帐/存储费用。