如何使用Grails中的真实路径加载图像

时间:2013-08-07 15:57:36

标签: html grails gsp

我的想法是将用户上传的图像保存在上下文路径之外,如下所示:

D:\somefolder\myWeb\web-app\
D:\somefolder\imagesOutsideContextPath\

该代码是下一个(在本地工作):

String path = servletContext.getRealPath("/"); 
String parentFolder = new File(path).getParentFile().getParent();
String imagesFolder = parentFolder + "\\imagesOutsideContextPath";

另一个想法(如果这个在服务器上不起作用)是将图像保存在当前用户的主文件夹中@HoàngLong suggested me

但我无法从视图中加载图像。我认为this article from official documentation无效。 下一个代码不会加载任何内容:

<img src="D:\\somefolder\\imagesOutsideContextPath\\bestImageEver.jpg" alt="if I don't see this message, I'll be happier">

我如何使用真实路径而不是网址路径来加载这些图像?

4 个答案:

答案 0 :(得分:2)

有一个新的插件可以轻松完成,请查看http://grails.org/plugin/img-indirect

答案 1 :(得分:2)

制作动作

def profileImage() {
    String profilePicturePath = "${grailsApplication.config.profilePictureDirectoryPath}/${params.id}"
    File file = new File(profilePicturePath)
    response.contentType = URLConnection.guessContentTypeFromName(file.getName())
    response.outputStream << file.bytes
    response.outputStream.flush()
}

然后使用图像名称调用此操作,例如:

<g:img uri="${grailsApplication.config.grails.serverURL}/controller/profileImage/${user?.profilePicture?.fileName}"/>

我在config.groovy文件中声明了图像目录文件,如:

profilePictureDirectoryPath = '/opt/CvSurgeon/profileImages'

答案 2 :(得分:1)

您可以将src设置为action。因此,您的用户将无法知道您的图像存储位置(安全性),您可以轻松更改逻辑以显示它们。

在动作中,只需获取图像并打印字节即可。 Example here

答案 3 :(得分:1)

首先,感谢您的参考。

使用真实路径加载图片是不安全的。 Web浏览器不应该知道图片在服务器上的保存方式,因此不了解文件夹结构。

我的意思是系统应该为您的所有图片使用特定的网址,例如http://your_app/photo/user/{id}。然后,在该URL中,您可以构建一个将id作为参数的动作,在文件系统中查找照片(当然您必须将图片文件夹存储在配置中),然后再渲染照片。