我正尝试使用以下代码在GSP页面中呈现来自/WEB-INF/images/sps
的图片:
def index = {
def baseFolder = grailsAttributes.getApplicationContext().getResource("/").getFile().toString()
println baseFolder
def imagesFolder = baseFolder + '/images/sps'
println imagesFolder
def imageList1 = new File(imagesFolder).list()
println imageList1
def imageList = Arrays.asList(imageList1)
println imageList
imageList
//redirect(action:"displayImages", params:["imageList":imageList])
//render(view:"displayImages")
}
控制器能够从fileSystem读取图像。但是当我尝试使用以下代码显示它们时,图像不会出现。
index.gsp中
<g:each in="${imageList}" var="image">
<img src="${resource(dir: 'images', file: image.filename)}" alt="Grails"/>
</g:each>
我做错了什么?
修改:
当我尝试单张图片时,它工作正常 - 我能够查看WEB-INF/images
文件夹中的图像
<img src="${resource(dir: 'images', file: '1.jpg')}" alt="Grails"/>
并且没有为循环代码生成的HTML代码(在index.gsp代码之上)。它只是空白。
我的要求是显示文件系统文件夹中的所有图像文件。
答案 0 :(得分:1)
这更简单。您应该将操作中的模型作为地图返回:[imageList: imageList]
imageList
,以便在GSP中按名称提供。
是的,您可以将images
文件夹移至web-app
- 全世界都可以通过HTTP请求您的图片吗?
答案 1 :(得分:0)
您将返回一个File对象列表,您将在其中调用文件对象的toString方法,该方法很可能返回文件对象的绝对文件路径。 这会在html源代码
中给你这样的东西<img src="/app/images/c:\path\to\imagefile.png">
尝试拨打
<img src="${resource(dir: 'images', file: image.name)}" alt="Grails"/>
如果不起作用,请告诉我们它生成的html代码。
根据新知识,上述方法无效。 File.list()的返回实际上是String [],其中每个字符串都是文件名而不是完整路径。
无论如何,看看html源代码可以了解究竟打印出来的内容。
我怀疑g:每个都不支持迭代像String []之类的简单数组类型,你可以尝试将它转换为List。
def imageList = Arrays.asList(new File(imagesFolder).list())
您是否尝试过将其转换为列表并使用g:各自使用它?
为什么要将图像存储在WEB-INF /图像中?为什么不只是图像?我认为代码${resource(dir:'images')}
会指向后者。
答案 2 :(得分:0)
您无法使用标准图片标记呈现位于WEB-INF下的图像。图像无法通过网络访问。您将需要另一个控制器,将图像流回视图。所以像这样:
class AvatarController {
def show = {
def userInstance = User.get(params.id)
def avatarFilePath = new File(userInstance.avatarURL)
response.setContentType("application/png")
response.setContentLength(avatarFilePath.size().toInteger())
OutputStream out = response.getOutputStream();
out.write(avatarFilePath.bytes);
out.close();
}
}
然后显示此图片:
<img src="/app/avatar/1234" />
我会让你根据自己的需要进行转换。但是,关键是您必须将图像重新流式传输,因为它在当前位置无法通过Web访问。
然而,最好只在WEB-INF之外提供服务。
答案 3 :(得分:0)
不要将数据存储在WEB-INF中,将图像存储在/ web-app / images /
:
def baseFolder = servletContext.getRealPath("/") def folder = baseFolder + '/images/' // web-app/images/ def imagesFolder = new File(folder) def files = imagesFolder.listFiles().toList() List<String> imageList = [] files.each { imageList.add(it as String) } return imageList
3:
<g:each in="${imageList}" var="image">
<img src="${resource(dir: 'images', file: image)}" alt="Grails"/>
</g:each>