Подтвердить что ты не робот

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

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

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

Здесь мой код groovy:

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

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

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

4b9b3361

Ответ 1

Проблема в том, что вы читаете содержимое файла в String с помощью "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