文件不会下载HTTP 200代码

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

我想从前端下载文件。该文件在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
javascript java html spring
2个回答
0
投票

Content-Type: application/force-download标题可能并不总是有效,因为某些浏览器/ Web客户端可能不支持附件下载。

尝试更改为正确的XLSX类型Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,然后检查浏览器/ Web客户端的文档。根据this answer使用Ajax下载文件可能不会在您的Web客户端中工作。


0
投票

我不确定XHR请求是否可以在浏览器上触发下载对话框。您可能希望使用下载URL生成新窗口 - 浏览器应检测内容处置并相应地处理下载。

如果您仍想使用XHR,则需要使用Blob - JavaScript blob filename without link

© www.soinside.com 2019 - 2024. All rights reserved.