我的想法是将用户上传的图像保存在上下文路径之外,如下所示:
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">
我如何使用真实路径而不是网址路径来加载这些图像?
答案 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作为参数的动作,在文件系统中查找照片(当然您必须将图片文件夹存储在配置中),然后再渲染照片。