如何在Grails中显示图像?

时间:2011-04-27 13:34:40

标签: image grails gsp

我正尝试使用以下代码在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代码之上)。它只是空白。

我的要求是显示文件系统文件夹中的所有图像文件。

4 个答案:

答案 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)

  1. 不要将数据存储在WEB-INF中,将图像存储在/ web-app / images /

  2. 控制器中的
  3. 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
    
  4. 你认为

    3:

       <g:each in="${imageList}" var="image">
           <img src="${resource(dir: 'images', file: image)}" alt="Grails"/>
        </g:each>