以grails和playframework显示照片

时间:2013-04-24 18:07:43

标签: grails playframework-2.0 grails-controller

我一直在使用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?

  • 显示图片的juste慢
  • 我可以在Playframework中做这样的事吗?如果是,怎么做?

感谢。

C.C。

1 个答案:

答案 0 :(得分:2)

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

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控制器中执行此操作,但是...)