gsp,来自数组字节的图像

时间:2011-03-27 10:37:12

标签: java grails gsp

我有一个JDO类和一个帮助类Image,用于在一个字节数组中存储图像

JDO课程:

@PersistenceCapable
class Recipe{

    @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        private Long key

        @Persistent
        private String description

        @Persistent(serialized = "true")
        private Image image;
}

图片类:

class Image implements Serializable {

    private byte[] content
    private String filename
    private String mimeType
}

在gsp页面中,我遍历了食谱并希望显示图像。 我可以做这样的控制器来获取图像src。

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

但是这样我必须将配方的密钥发送到此控制器并再次从数据存储区加载图像。 (我已经加载了它。但我想我无法将这些数据发送给控制器。我可以吗?) 是否有更方便的方法来显示gsp页面中字节数组的图像?

1 个答案:

答案 0 :(得分:1)

我在这里有一个类似的用例,一个包含byte []的File域类和上传文件的元信息。要下载该文件,我正在使用:

def fileDownload = {
    long id = params.id as long
    def file = File.get(id)
    assert file
    def fileName = URLEncoder.encode(file.name)
    response.addHeader("content-disposition", "attachment;filename=$fileName")
    response.contentType = file.contentType
    response.contentLength = file.data.size()
    response.outputStream << file.data
}

关于重复加载文件我不会太在意,Hibernate二级缓存关心它。如果您仍有充分的理由不在下载请求中加载文件,则可以将其存储在上一次调用中的http会话中。 将此存储在http会话中的缺点:

  • 在多个并发会话的情况下,内存消耗高
  • 你会看到来自Hibernate的奇怪异常(确保这一点!)
  • 存储在http会话中的所有内容都必须是可序列化的