Spring MVC - загрузка PDF с использованием outputtream & HttpServletResponse - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь написать контроллер, который загружает PDF-файл в браузер. Я использую Jasper Reports для генерации PDF-файла в коде Java (полностью протестирован, и он отлично работает). Теперь я хочу получить поток вывода, который пишется Jasper Reports, и загрузить его в браузер. Однако, когда я нажимаю кнопку (которая отправляет POST методу моего сопоставленного контроллера), загрузка не происходит, и не возникает ошибка.

Соответствующий код:

@RequestMapping("/vm/dormant/pdfReport")
public void exportIdleVMReport(@RequestParam(value = "sdkUrl", required = true) String sdkUrl, 
        @RequestParam(value = "threshold", required = false, defaultValue = "30") int threshold,
        HttpServletResponse response) {

    try {
        //Generated jasperPrint here
        .....

        //OutputStream outputStream = new FileOutputStream(file);
        ServletOutputStream outputStream=response.getOutputStream();
        /* Write content to PDF file */
        JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
        response.addHeader("Content-disposition", "attachment; filename=" + "employee.pdf");
        response.setContentType("application/pdf");
        outputStream.close();
        outputStream.flush();
        System.out.println("File Generated");

    } catch (RemoteException | MalformedURLException e) {
        e.printStackTrace();
    } catch (JRException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

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

РЕДАКТИРОВАТЬ: Я не знаю, если это имеет значение, но я должен добавить, что это старый проект в моей компании. В проекте используются зависимости среды Spring от версии 4.3.0.RELEASE, сервлет javax версии 3.0.1.

РЕДАКТИРОВАТЬ 2: Протестировано путем изменения кода внешнего интерфейса для непосредственного доступа к / vm / dormant / pdfReport, и это работает! Если HttpServletResponse должен отправить ответ обратно на URL-адрес, с которого я отправил AJAX, почему он не работает должным образом?

1 Ответ

1 голос
/ 24 октября 2019

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

response.addHeader("Content-disposition", "attachment; filename=" + "employee.pdf");
response.setContentType("application/pdf");
ServletOutputStream outputStream=response.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
outputStream.flush();
outputStream.close();

плюс рекомендуется указывать метод запроса:

@ RequestMapping ("/ vm/ dormant / pdfReport ", method = POST)

Если @RequestParam обрабатывается немного по-другому между GET и POST, это может объяснить, почему код генерации отчета не работает для POSTно работает для GET согласно вашему описанию.

...