【问题标题】:Display Dynamic Image in Play! Framework Template在播放中显示动态图像!框架模板
【发布时间】:2014-03-17 06:07:54
【问题描述】:
我正在创建一个 Play 2.2 应用程序,根据 URL,我需要从 S3 检索图像并将其呈现给用户。
我知道我可以在获得图像后渲染它,但我想将它嵌入到网页中,以便我可以将其居中并在必要时显示更多信息。
我看到了两种可能的选择:
选项 A:
- 将图片的 URL 从 S3 返回到模板,然后在 img src 标签中使用它
- 这将是一个简单的解决方案,而且性能很好,因为我不必通过我的应用程序传递它
- 但是,我无法控制图像。如果我想调整它的大小或进行任何其他处理,那将是不可能的,这不太理想。
选项 B:(首选方法)
- 在我的控制器中从 S3 中检索图像,将其作为参数传递给模板并在图像标签中呈现它
- 我不知道如何让它工作,但它会是首选选项
- 我可以调整图像大小并确保它“安全”地显示
第二种可能吗?如果是这样,这是一种可以接受的方法吗?或者性能损失是否值得?
【问题讨论】:
标签:
image
scala
playframework
amazon-s3
playframework-2.0
【解决方案1】:
免责声明:无论如何,这是可能的,因为您的问题是“基于意见”的 - 答案也只是一个建议(或建议的一部分)。
首先,使用一些图形库来处理图像,即我们目前正在使用GraphicsMagick (GM) + gm4java(抱歉,不知道 Scala 的正确库是什么)来进行文件裁剪,速度快,很好,工作就像预计。
在我们的例子中,我们需要避免向未经授权的用户显示原始/裁剪图像的可能性,因此我们在检查访问权限后使用 Play 的return ok(new File(path)) 将其返回,但对于公共资产,您也可以只使用即一些 HTTP服务器将只处理传递图像,甚至将裁剪后的图像发送回 S3,然后直接在 src 属性中使用它的 URL。
方法很简单:
- 有一些 Play 操作可以获取参数,例如原始文件的路径(可以翻译以与 S3 API 一起使用)
- 它从 S3 获取 origin 文件(如果需要)并将其保存在本地 HDD 上以供进一步处理
- 使用 GM 处理文件,即裁剪并调整大小,然后将其保存到本地硬盘或发送到 S3 的特殊存储桶/文件夹,并具有唯一名称
- 最后,它返回文件的路径(在 S3/HDD 上)或将返回此生成文件的操作(有限制)。
- 您可以在操作后立即删除 origin 的 local 副本,但也可以将其保留在那里以供其他选项使用(至少一段时间) - 然后使用调度程序清除 早于 X 天的来源。
请记住,每次请求裁剪版本时,将 S3 文件提取到 Play 应用程序并处理它的选项相当糟糕(意味着:缓慢且昂贵),因此添加一些额外的 HDD 空间将origins 和cropped 尽可能长时间地保留在目标计算机上。
另外提示:从结果缩略图中删除 color profile(带有 GM)会减小它的大小,这样您就可以节省额外的美元转账/存储费用。