0

我一直在使用 Grails 框架进行一些测试,现在我正在尝试在 playframework 中做类似的事情。

基本上,我想显示一些图片,但要隐藏(为了能够避免任何爬行并能够更改托管)图片路径。

gsp页面:

<g:each in="${images}"  var="img">
        <img class="thumbnail" src='${createLink(controller: "images", action: "displayImage", params:[img: img.name])}'/>
</g:each>

控制器:

def displayImage() {
        File image = new File(IMAGES_DIR.absolutePath +'/' + params.img)
        if(!image.exists()) {
            response.status = 404
        } else {
            response.setContentType("application/jpg")
            OutputStream out = response.getOutputStream();
            out.write(image.bytes);
            out.close();
        }
}

html 生成的页面如下所示:

<img class="thumbnail" src='/myhost/images/displayImage?img=blabla.jpg' />

我的问题:

  • 这是最好的方法吗?

  • 关于性能?

  • 这比使用 http 显示图片慢吗?

  • 我可以在 Playframework 中做这样的事情吗?如果是,如何?

谢谢。

抄送

4

1 回答 1

2

对于静态公共资源,最有可能使用原始 HTTP 服务器将是最快的解决方案,所以我认为不需要通过 Java 控制器“拖动”它。实际上,您可以使用非常相似的 Play 来做到这一点,但更容易 - 因为 Play 允许您直接返回 aFile作为响应主体,即(从我的头顶写下):

public static Result displayImage(String imagePath) {
    File image = new File(SOME_CONFIGURED_FOLDER_WITH_IMAGES +'/' + imagePath)
    if(!image.exists()) return notFound();
    return ok(image).as("image/jpg");
}

无论如何,您应该仅在以下情况下使用它:

  • 不会使用额外的 HTTP 服务器(记住,Play 已经内置了一个?)
  • 你需要带一些访问控制
  • 您想要执行一些操作,即。缩放、裁剪等(在这种情况下,恕我直言,最好只使用 Play 来创建缩略图,并使用通用 HTTP 服务器提供它......)

感谢这种方法:

  • 您不会浪费处理器的资源,因为 HTTP 服务器只需要提供存储在磁盘上的文件,而不是将其重写为Result.
  • 您的应用程序可以专注于其他动态操作,因此速度更快。
  • 您可以(并且应该)使用典型的网站管理员技术来优化服务静态内容,例如cookie free domains,高级caching headers等(您也可以在 Play 控制器中这样做,但是......)
于 2013-04-24T18:56:41.130 回答