Скачать файл Grails - PullRequest
       19

Скачать файл Grails

22 голосов
/ 28 декабря 2008

Я пытаюсь создать сайт, который позволяет пользователям загружать файлы любого типа. Я реализовал эту функцию хорошо, и файл хранится на сервере. Позже они могут загрузить файл для просмотра, но у меня возникают проблемы с его работой.

Я использовал любые примеры, которые могу достать, но все они, как правило, используют текстовые файлы в качестве примеров. Моя проблема в том, что файлы PDF и многие другие типы файлов загружаются неправильно. Кажется, они нормально скачиваются, но ни один из файлов не откроется успешно. Сравнивая файлы, кажется, что содержание большинства файлов правильное, но некоторые части - нет.

Вот мой отличный код:

def file = new File(params.fileDir)    
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "filename=${file.getName()}")
response.outputStream << file.text
return

Этот код хранится внутри контроллера, который вызывается ссылкой для скачивания. Я пытался поиграть с разными типами контента, но я не знаю, какой я мог бы использовать для любого типа - есть ли? Все, что я пробую, не решает проблему.

Спасибо за вашу помощь.

1 Ответ

41 голосов
/ 29 декабря 2008

Проблема заключается в том, что вы читаете содержимое файла в строку с помощью "file.text". Содержимое файла преобразуется с помощью системной кодировки символов, даже если содержимое является двоичным, а не текстовым (например, файлы PDF являются двоичными), и отправляется клиенту с использованием кодировки ответа и, таким образом, модифицирует двоичное содержимое. Вы должны использовать другой подход, подобный этому:

def file = new File(params.fileDir)    
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "attachment;filename=${file.getName()}")

response.outputStream << file.newInputStream() // Performing a binary stream copy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...