2008-11-03 72 views
9

我仍在学习Grails,似乎已经遇到了绊脚石。如何在grails GSP中显示图像?

这里是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是不正确的。谢谢!!

+0

你试过这个吗?它应该使'viewImage'以id = 1的方式被调用,参考一个Photo实例,假设范围内有一个'profileInstance'。您可能需要调整回复内容类型 您是否问如何选择_which_照片显示? – 2008-11-03 18:37:49

+0

我希望能够在集合中显示第一张照片,谢谢。 – Walter 2008-11-04 01:22:51

回答

3

由于它是一个集合,如果你想第一个元素,你将不得不去:

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

profileInstance.photos.iterator().next() 
+0

是的,/ photo/viewImage/{anyPhotoId}不会正确显示照片。其实我想我使用了一个Set而不是ArrayList。这是问题的根源吗?谢谢! – Walter 2008-11-04 01:21:11

+0

@Walter - 是的。我修改了我的答案。 – 2008-11-04 11:01:45

0

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

response.ContentType = "image/jpeg" 

这可能或可能不需要在流到响应流之前(无法想象它会有影响)。我只是把它放在上面的代码中的outputStream行之前。

2

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

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

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; 
    } 
0

ID:“profileInstance.photos.get(1).ID”应该be id:profileInstance.photos.get(1).id。没有配额

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的解决周围的双引号的表达。否则,它将其作为字符串。