我已将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会给我带来乱码输出。
答案 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()。享受。