当前位置: 首页 > 知识库问答 >
问题:

Spring-下载响应作为文件

何飞翰
2023-03-14

我正在使用AngularJS和Spring编写应用程序。我想向服务器发送请求,并下载控制器返回的响应作为文件。在控制器中,我有csv文件的内容(作为字符串),即<代码>1;2.3.4(1行4列)。将此响应下载为文件的最简单方法是什么?

下面,我发布了我的简化代码。Spring控制器:

@RequestMapping(value = "/csv", method = GET)
@ResponseBody
public String getCsvFile() {
    return getCsvContent();
}

在javascript中(AngularJS)

return $http({method: 'GET', url: 'csv/'});

我还试图写入响应流(如下所示),设置标题,但在客户端,我总是以字符串的形式获取这些内容,而不是下载文件。

@RequestMapping(value = "/csv", method = GET)
@ResponseBody
public void getCsvFile(HttpServletResponse response) {
    response.setContentType("application/csv");
    response.setHeader("Content-Disposition", "attachment; filename=file.csv");
    response.setContentLength(getCsvContent().getBytes().length);
    ServletOutputStream out = response.getOutputStream();
    out.write(getCsvContent());
    out.flush();
    out.close();
}

有人知道如何正确编写控制器的方法以便将响应作为文件下载到客户端吗?

共有3个答案

聂季同
2023-03-14

可以使用XHR请求下载文件。您可以使用angular$http加载文件,然后使用HTML5的Blob功能让浏览器保存它。有一个库可以帮助您保存:FileSaver。js

穆季萌
2023-03-14

我自己也在努力解决这个问题,试图从服务器上实现它。不能。相反。。。

>

  • 要澄清@dnc253的答案,请点击$窗口。open(URL)是一种让角度应用程序在另一个窗口中打开给定URL的方法。(它实际上只是通用窗口的可测试角度代理。open())这是一个很好的解决方案,可以保存您的历史记录,下载文件,如果支持的话,还可以在新的浏览器窗口中呈现文件。但它经常遇到弹出窗口拦截器,这对可靠性来说是一个巨大的问题。用户通常只是不理解他们在做什么。因此,如果您不介意立即使用当前窗口下载文件,您可以简单地使用同样有效的通用javascript方法:<代码>位置。href=“uriString”,这对我来说很有魅力。Angular甚至没有意识到发生了什么事。一旦我的POST/PUT操作完成,我就在promise处理程序中调用它。如果需要,让POST/PUT返回要调用的URL,如果您还不能推断出来的话。您将获得与用户下载响应PUT/POST时相同的行为。例如:

    $http.post(url, payload).then(function(returnData){
        var uriString = parseReturn(returnData);
        location.href="uriString"
    })
    

    事实上,您可以直接从XHR请求下载某些内容,但它需要对HTML5文件API的完全支持,并且通常比它的价值更麻烦,除非您需要在将文件提供给用户之前对其执行本地转换。(遗憾的是,我没有时间提供这方面的详细信息,但还有其他SO关于使用它的帖子。)

  • 郦祯
    2023-03-14

    您不能通过XHR请求(Angular发出请求的方式)下载文件。看看为什么不能使用ajax请求下载文件?您需要通过“<代码>$”窗口转到URL。打开或执行此处显示的iframe技巧:JavaScript/jQuery通过POST下载包含JSON数据的文件

     类似资料:
    • 问题内容: 我正在使用AngularJS和Spring编写应用程序。我想将请求发送到服务器,并将控制器返回的响应下载为文件。在控制器中,我有csv文件的内容(作为字符串),即(1行4列)。将此响应下载为文件的最简单方法是什么? 下面,我发布了我的简化代码。在Spring控制器中: 在javascript(AngularJS)中 我也在尝试(在下面)写入响应流,设置标头,但是在客户端,我总是以字符串

    • 问题内容: 这是其中的代码 返回的响应是一个文件。我希望用户能够将其保存为文件,但是什么也没有发生。我认为服务器返回的响应类型正确,因为在控制台中它说 我想念的是什么?我应该在减速器中做什么? 问题答案: 浏览器技术当前不支持直接从Ajax请求下载文件。解决方法是添加一个隐藏的表单并将其提交到幕后,以使浏览器触发“保存”对话框。 我正在运行标准的Flux实现,因此不确定确切的Redux(Reduc

    • 我有一个API可以返回excel文档作为响应。请求将是一个简单的JSON。 我搜索了谷歌,找到了一些代码库下载文件,我已经在我的应用程序中使用了它,但我得到了一些错误,无法找到它的解决方案。下面是我的代码库。 NameService.ts HTTPService.ts 使用上面的代码库,我得到了以下两个错误,文件没有下载。 null

    • 问题内容: 我正在尝试使浏览器下载从ajax响应接收到的pdf文件。 受jquery ajax下载pdf文件启发,我模拟了如下单击/下载事件: 不幸的是,这仅适用于Chrome,不适用于Firefox + IE。当我尝试在最后两个浏览器中触发它时,没有任何反应。 由于从CMS继承,脚本和标记被放置在iframe中,但是我不确定这是否有影响。 关于如何针对所有现代浏览器进行优化的想法? 问题答案:

    • 我想公开一个API来将S3 bucket文件内容作为流下载给它的使用者。API URL类似于/downloadfile/**,即GET request。 现在返回类型应该是什么?我尝试使用accept header=application/octet-stream,但不起作用。 我不想把文件的内容写到任何文件中并发送它。它应该作为流返回。 这里是控制器伪代码,我写到现在,它给我406错误所有的时间

    • 问题内容: Expressjs框架具有sendfile()方法。我如何在不使用整个框架的情况下做到这一点。我正在使用node-native- zip创建档案,并将其发送给用户。 问题答案: 这是一个示例程序,它将通过从磁盘流式传输myfile.mp3来发送myfile.mp3(也就是说,在发送文件之前,它不会将整个文件读入内存)。服务器在端口2000上侦听。 [更新] 正如@Aftershock在