Grails blob到pdf

时间:2012-05-29 18:48:48

标签: grails groovy

我已将pdf文件存储为blob,当我尝试在浏览器中将其呈现为pdf时,它看起来像这样:

%PDF-1.4 %���� 5 0 obj <>stream x��[]s�6}    

这是我在我正在使用的控制器中的动作    def showDetails = {

    def product = Sample.get(params.id)

    response.contentType = 'application/pdf' 
    response.setHeader('Content-disposition', 'attachment; filename=file.pdf')
    response.getOutputStream().write(product.file)

    response.getOutputStream().flush()

}

我也尝试添加response.characterEncoding = "utf 8",但这也无效。

只是为了澄清:我有一个表格将pdf文件存储为blob。一旦对象存储在数据库中,对象和一些参数(名称,日期等)就会出现在我的应用程序中。该名称是可点击的,它将在div中呈现指向blob文件的链接:

<g:remoteLink id="${s.id}" update="details"  controller="submitSample"action="showDetails" >${s.sampleNameID}</g:remoteLink></td>

如果我将getOutputStream更改为getBytes(),我会收到此错误:

No signature of method: [B.getBytes() is applicable for argument types: () values: []

可能的解决方案:getClass(),getAt(groovy.lang.ObjectRange),getAt(java.lang.Integer),getAt(groovy.lang.IntRange),getAt(java.lang.String),getAt(groovy。 lang.Range)。

简单地使用product.file会给我带来乱码输出。

2 个答案:

答案 0 :(得分:2)

尝试同时指定Content-Disposition

response.contentType = 'application/pdf'
response.setHeader('Content-disposition', 'Attachment; filename=file.pdf')
response.getOutputStream().write(product.file)

答案 1 :(得分:2)

我不确定product.file的数据类型是什么,但假设它是java.io.File,这可能会有用......

  response.setContentType('application/pdf');
  response.setHeader('Content-disposition', 'Attachment; filename=file.pdf');
  response.getOutputStream().write(product.file.toNewInputStream());
  response.getOutputStream().flush();

但是,如果product.file是一个blob,那么在将其发送到浏览器响应之前,您需要从中获取字节数...

 response.setContentType('application/pdf');
 response.setHeader('Content-disposition', 'Attachment; filename=file.pdf');
 response.getOutputStream().write(product.file.getBytes());
 response.getOutputStream().flush();

这是未经测试的代码,但我认为您明白了。我认为你看到奇怪的字符打印到浏览器输出,因为它只是在做你的blob的toString()。享受。