Spring MVC-使用outputstream和HttpServletResponse下载PDF

问题描述 投票:0回答:1

我正在尝试编写一个在浏览器上下载pdf文件的控制器。我正在使用Jasper Reports以Java代码生成pdf文件(经过充分测试,并且可以正常运行)。现在,我想获取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();
    }
}

我成功到达“ File Generated”,没有任何错误,我也使用绝对路径生成文件,并且工作正常。当我单击按钮时,我只是没有在浏览器上下载任何文件。由于服务器或浏览器上都没有错误,所以我不知道自己在做什么错。谁能告诉我我的代码出了什么问题?

编辑:我不知道这是否重要,但我要补充一点,这是我公司的旧项目。该项目使用4.3.0.RELEASE版本的spring框架依赖项,javax servlet是3.0.1版。

编辑2:通过更改前端代码直接到达/ vm / dormant / pdfReport进行测试,并且可以使用!如果HttpServletResponse应该将响应发送回我发送AJAX的URL,为什么它不能正常工作?

java rest spring-mvc servlets jasper-reports
1个回答
1
投票

看起来像是在设置响应之前写入输出。我不知道贾斯珀在做什么,但这可能是更可能的命令:

response.addHeader("Content-disposition", "attachment; filename=" + "employee.pdf");
response.setContentType("application/pdf");
ServletOutputStream outputStream=response.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
outputStream.flush();
outputStream.close();
© www.soinside.com 2019 - 2024. All rights reserved.