9

我仍在学习 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是不正确的。

4

6 回答 6

4

如果您有图像的 url,您只需确保在控制器中返回适当的分析器:

  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;
  }
于 2008-11-09T12:37:47.573 回答
3

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

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

或者

profileInstance.photos.iterator().next()
于 2008-11-03T17:29:43.023 回答
2

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

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

于 2008-11-06T13:28:35.160 回答
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 解析双引号周围的表达式。否则它将它作为字符串。

于 2012-03-28T04:38:17.460 回答
0

我的猜测是您需要设置响应流的内容类型。就像是:

response.ContentType = "image/jpeg"

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

于 2008-11-03T21:27:16.163 回答
0

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

于 2010-03-14T03:08:53.883 回答