我还在学习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
不正确。
答案 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)
<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。没有配额