我一直在使用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中做这样的事吗?如果是,怎么做?
感谢。
C.C。
答案 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");
}
无论如何,只有在以下情况下才能使用它:
感谢这种方法:
Result
。cookie free domains
,高级caching headers
等。(您也可以在Play控制器中执行此操作,但是...)