Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
31 Май 2024
2 мин
660

Загрузка файла из контроллеров Spring

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

Существует типичная задача, когда нужно сгенерировать PDF-файл на сервере и предоставить его для скачивания пользователю. Например, это может быть отчет, который формируется на основе данных из базы данных, и пользователь должен иметь возможность скачать его в виде PDF-файла.

Идеально для решения этой задачи подходит сочетание двух технологий: шаблонизатора freemarker для формирования HTML-шаблона отчета и библиотеки iText для преобразования HTML в PDF. Однако возникает вопрос — как организовать загрузку этого файла через Spring контроллер?

Генерация PDF

Для начала требуется сгенерировать сам PDF. В качестве шаблона используется HTML, который заполняется данными при помощи freemarker. Затем этот HTML преобразуется в PDF с помощью iText.

String html = freemarkerTemplateEngine.process("reportTemplate", model);
ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();
PdfRendererBuilder builder = new PdfRendererBuilder();
builder.withHtmlContent(html, "/");
builder.toStream(pdfOutputStream);
builder.run();

Метод freemarkerTemplateEngine.process заполняет HTML-шаблон данными, а PdfRendererBuilder преобразует HTML в PDF.

Отправка файла через Spring контроллер

Теперь, когда PDF сгенерирован, его можно отправить пользователю. Для этого в контроллере Spring создается новый метод, который возвращает ResponseEntity.

@RequestMapping(value = "/download", method = RequestMethod.GET)
public ResponseEntity<byte[]> downloadReport() {
    byte[] pdfData = generatePdfReport(); // метод, который генерирует PDF
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_PDF);
    headers.setContentDispositionFormData("filename", "report.pdf");
    return new ResponseEntity<>(pdfData, headers, HttpStatus.OK);
}

В этом методе генерируется PDF, затем создается новый объект HttpHeaders, в котором устанавливается тип контента и имя файла. Затем создается и возвращается новый объект ResponseEntity, который содержит данные PDF, заголовки и статус HTTP.

Таким образом, при запросе к данному контроллеру пользователь получает PDF-файл, который можно скачать.

Это один из возможных способов решения задачи. Важно помнить, что в разных ситуациях могут потребоваться разные подходы.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий