2011-03-27 85 views
0

我有一个JDO类和辅助类图像以存储一个字节数组内的图像GSP,从数组字节图像

JDO类:

@PersistenceCapable 
class Recipe{ 

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

     @Persistent 
     private String description 

     @Persistent(serialized = "true") 
     private Image 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

看起来像重复http://stackoverflow.com/questions/4502278/grails-displaying-created-image-in-gsp/4502403给我。我的答案可以帮助;) – 2011-03-28 08:32:01

+0

嗨维克多。感谢您的评论。在这个问题上我没有看到你的建议。但这看起来正是我在寻找的东西。当我回家的时候会试试这个。谢谢 – superbly 2011-03-28 08:42:29

+0

这么多善良的话,没有一个upvote xD – 2011-03-28 09:04:25

回答

1

我有一个类似的用例在这里,一个文件域类保存一个字节[]和上传文件的元信息。要下载文件,我使用的是:

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会话存储这种的缺点:

  • 在许多并发会话,占用大量内存
  • 的情况下,你会看到从休眠奇怪的例外(请务必为!)
  • 一切存储在http会话必须是可序列化的
+0

嗨感谢您的答案。希望能有另一种解决方案。 – superbly 2011-03-28 07:23:06