2012-05-29 6 views
1

Я хранится файл в формате PDF в виде сгустка,, когда я пытаюсь сделать это в формате PDF в браузере, это выглядит следующим образом:Grails блоб в формате PDF

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

Это мое действие в контроллере Я использую Защиту 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:

<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

Что такое product.file, это java.io.File или Blob? Если это blob, вам нужно сначала преобразовать его в массив байтов. –

ответ

2

Попробуйте также указав Content-Disposition:

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

+1 избили меня ;-) –

+0

Я все еще получаю странную строку символов даже после добавления setHeader. Я обновил свой оригинальный пост новыми предложениями. – Universitas

+0

@universitas Как выглядит класс вашего продукта? –

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(); 

Это код не проверен, но я думаю, вы поняли идею. Я думаю, что вы видите, как странные символы печатаются на выходе из браузера, потому что он просто делает toString() вашего блоба. Наслаждаться.

+0

Файл является блобом. Я сохранил blob в моем db, и теперь я пытаюсь вытащить его и отобразить на экране. – Universitas

+0

Кроме того, я не уверен, как сделать ссылку: '' – Universitas

+1

Идентификатор id является идентификатором HTML, но обычно используется для хранения идентификаторов базы данных класса домена в grails. Это фундаментальная концепция, и я предлагаю вам пройти через некоторые учебные пособия, прежде чем потерять или отправить другой вопрос. –