【发布时间】:2020-02-20 13:31:19
【问题描述】:
我正在尝试编写一个在浏览器上下载 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,为什么它不能正常工作?
【问题讨论】:
-
“前端代码直接到达/vm/dormant/pdfReport”是什么意思?为什么不直接去那里?
-
@codebrane 这意味着我没有使用 ajax 对 /vm/dormant/pdfReport 进行 POST,而是直接使用参数构建了 URL 字符串,并使按钮打开一个指向该 URL 的新窗口。现在,当我单击按钮时,页面会加载一段时间,然后下载文件并自动关闭选项卡。除了前端代码,我什么都没改变。为什么我发送 AJAX 时 servlet 响应不起作用,但如果我直接访问 URL 就可以了?
-
这听起来像您使用带有按钮的 GET 但带有 Ajax 调用的 POST。可能存在细微差别。我已经更新了明确使用 POST 作为方法来查看这是否有助于 Ajax 调用的答案。就目前而言,该方法将同时处理这两种情况,但最好明确说明该方法
标签: java rest spring-mvc servlets jasper-reports