java - Spring MVC - 使用 outputstream 和 HttpServletResponse 下载 PDF
问题描述
我正在尝试编写一个在浏览器上下载 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();
}
}
我成功地到达“文件生成”,没有任何错误,我还使用绝对路径生成文件,效果很好。单击按钮时,我根本没有在浏览器上下载任何文件。由于服务器或浏览器上都没有错误,我不知道我做错了什么。谁能告诉我我的代码有什么问题?
编辑:我不知道这是否重要,但我应该补充一点,这是我公司的一个旧项目。该项目使用版本为 4.3.0.RELEASE 的 spring 框架依赖项,javax servlet 版本为 3.0.1。
编辑 2:通过更改前端代码直接到达 /vm/dormant/pdfReport 进行测试,它可以工作!如果 HttpServletResponse 应该将响应发送回我发送 AJAX 的 URL,为什么它不能正常工作?
解决方案
看起来在设置响应之前正在写入输出。我不知道 Jasper 做了什么,但这可能是一个更有可能的命令:
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", 方法 = POST)
如果@RequestParam
两者之间的处理方式略有不同GET
,POST
这可以解释为什么报告生成代码不起作用POST
但GET
根据您的描述起作用。
推荐阅读
- python - 如何从构成体素化体积中的一条线的 3D 点列表中获取体素数组?
- java - 在spring-boot应用程序中自动装配组件时如何解决NullPointerException
- java - 游戏在功能强大的设备上速度较慢。我正在使用三角洲
- java - 如何清理 thymeleaf 模板的 json 输出?
- python - 如何使正则表达式仅匹配整个单词而不分解单词?
- python - 使用请求发送到其他 API 时,上传到 Flask 的文件为空
- symfony - 控制器能够搜索名字和姓氏
- laravel - laravel 表单不断重定向到同一页面
- java - 为什么我无法使用 JavaMail(IMAP 协议)连接到我的邮箱并出现 NO AUTHENTICATE failed 错误?
- spring - 使用空字符串作为属性的默认值,以便它可以与其他字符串连接形成一个值