我想从前端下载文件。该文件在TestFlow.generateReport
方法中生成。
我的代码运行到最后但它没有下载任何东西。它只是将数据打印到console.log
。
我在这里错过了什么?
我的后端控制器:
@RequestMapping(value = "/flow/generate-report" , method = RequestMethod.GET)
public @ResponseBody void generateFlowReport(@RequestParam("flowName") String flowName, HttpServletResponse response) {
InputStream resource = TestFlow.generateReport(flowName);
response.setContentType("application/force-download");
response.setHeader("Content-Disposition","attachment; filename=report-" + flowName + ".xlsx");
try {
IOUtils.copy(resource,response.getOutputStream());
response.flushBuffer();
resource.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我的前端代码:
$('.generateReport').click(function () {
var flowName = $(this).attr('name');
$.ajax({
url: '/flow/generate-report',
type: 'get',
data: {flowName: flowName},
success: function (data) {
console.log(data);
}
})
});
我获得HTTP状态200
HTTP/1.1 200
Content-Disposition: attachment; filename=report-tellerFlow.xlsx
Content-Type: application/xlsx
Transfer-Encoding: chunked
Content-Type: application/force-download
标题可能并不总是有效,因为某些浏览器/ Web客户端可能不支持附件下载。
尝试更改为正确的XLSX类型Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
,然后检查浏览器/ Web客户端的文档。根据this answer使用Ajax下载文件可能不会在您的Web客户端中工作。
我不确定XHR请求是否可以在浏览器上触发下载对话框。您可能希望使用下载URL生成新窗口 - 浏览器应检测内容处置并相应地处理下载。
如果您仍想使用XHR,则需要使用Blob - JavaScript blob filename without link