2

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

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 建议我的那样。

但我无法从视图中加载图像。我认为官方文档中的这篇文章对此无效。下一个代码不加载任何内容:

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

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

4

4 回答 4

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'
于 2013-08-07T17:42:34.637 回答
2

有一个新插件可以让这变得简单,请查看http://grails.org/plugin/img-indirect

于 2013-08-07T16:58:50.463 回答
1

您可以将 设置srcaction. 这样,您的用户将不知道您的图像存储在哪里(安全性),您可以轻松更改逻辑以显示它们。

在操作中,只需获取您的图像并打印字节。这里的例子

于 2013-08-07T16:01:54.613 回答
1

首先,感谢您的参考。

使用真实路径加载图像是不安全的。Web 浏览器应该对图片如何保存在服务器上一无所知,因此不知道文件夹结构。

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

于 2013-08-08T07:02:04.307 回答