如何在Grails GSP中显示图像?

时间:2008-11-03 17:10:02

标签: image grails groovy

我还在学习Grails,似乎遇到了绊脚石。

以下是2个域类:

class Photo {
    byte[] file 

    static belongsTo = Profile
}


class Profile {
    String fullName
    Set photos

    static hasMany = [photos:Photo]     
}

相关的控制器代码段

class PhotoController {

    def viewImage = {

      def photo = Photo.get( params.id )
      byte[] image = photo.file 
      response.outputStream << image

    } 
} 

最后是GSP代码段

<img class="Photo" src="${createLink(controller:'photo', action:'viewImage', id:'profileInstance.photos.get(1).id')}" />

现在如何访问照片以便它将显示在GSP上?我很确定 profileInstance.photos.get(1).id不正确。

6 个答案:

答案 0 :(得分:4)

如果您有图像的网址,则只需确保在控制器中返回相应的广告:

  def viewImage= {
    //retrieve photo code here
    response.setHeader("Content-disposition", "attachment; filename=${photo.name}")
    response.contentType = photo.fileType //'image/jpeg' will do too
    response.outputStream << photo.file //'myphoto.jpg' will do too
    response.outputStream.flush()
    return;
  }

答案 1 :(得分:3)

因为它是一个Set,如果你想要第一个元素,你将不得不去:

profileInstance.photos.toArray()[0].id

profileInstance.photos.iterator().next()

答案 2 :(得分:2)

现在,我实际上认为将照片作为二进制blob存储在数据库中并不是最好的解决方案 - 尽管您可能有理由说明为什么需要这样做。

如何存储照片的名称(和/或路径)呢?如果可能存在名称冲突问题,请使用照片的md5校验和作为名称。然后照片变成静态资源,一个简单的文件,而不是更复杂和更慢的MVC请求。

答案 3 :(得分:1)

我正在学习grails也在寻找像这样的例子。 GSP snipplet对我不起作用。我通过替换profileInstance.photos.get(1).id

周围的单引号来解决
<img class="Photo" src="${createLink(controller:'photo', action:'viewImage', id:'profileInstance.photos.get(1).id')}" />
带双引号的

<img class="Photo" src="${createLink(controller:'photo', action:'viewImage', id:"profileInstance.photos.get(1).id")}" />

现在grails解析双引号周围的表达式。否则它将它作为字符串。

答案 4 :(得分:0)

我的猜测是你需要设置响应流的内容类型。类似的东西:

response.ContentType = "image/jpeg"

在您流式传输到响应流之前,这可能需要也可能不需要(无法想象它会重要)。我只是将它放在上面代码中的outputStream行之前。

答案 5 :(得分:0)

id:'profileInstance.photos.get(1).id'应为id:profileInstance.photos.get(1).id。没有配额