1

我已将 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 会给我输出乱码。

4

2 回答 2

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() 。享受。

于 2012-05-29T20:12:36.257 回答
2

尝试同时指定Content-Disposition

response.contentType = 'application/pdf'
response.setHeader('Content-disposition', 'Attachment; filename=file.pdf')
response.getOutputStream().write(product.file)
于 2012-05-29T19:01:41.110 回答