我有一个REST API,如果我直接在浏览器中查询,它会返回一个JSON或CSV文件进行下载。我想用Angular HttpModule做同样的事情。
我的get请求很简单(它有一个查询字符串参数来指示要返回的文件格式):
public Submit(request: Request) {
...
return this.http.get(url).subscribe(response => {
//What here
});
}
响应内容类型为application/octet-stream
。我已经尝试将响应处理为blob,但这不起作用。我怎样才能将服务器的响应传递给浏览器并让它下载文件?此方法是响应按钮单击
onClick() {
this._requestService.Submit(request); //This gets the Subscription response from the service, but I want it to let the broswer download the file
}
答案 0 :(得分:4)
this.http.get(url).subscribe(response => {
const blob = new Blob([response], { type: 'text/csv' });
const url= window.URL.createObjectURL(blob);
window.open(url);
});
答案 1 :(得分:4)
你必须添加
{ responseType: ResponseContentType.Blob }
然后将响应映射到blob。
return this.http.get(url, { responseType: ResponseContentType.Blob })
.map(r => r.blob())
.subscribe(response => {
});
接下来,您可以使用fileSaver.js下载此文件。
答案 2 :(得分:1)
我从AngularJS $http-post - convert binary to excel file and download和AngularJS: Display blob (.pdf) in an angular app获得了大部分解决方案。
let ieEDGE = navigator.userAgent.match(/Edge/g);
let ie = navigator.userAgent.match(/.NET/g); // IE 11+
let oldIE = navigator.userAgent.match(/MSIE/g);
let blob = new Blob([response.text()], { type: "application/octet-stream"});
let fileName: string = "myfile." + this.request.output;
if (ie || oldIE || ieEDGE) {
window.navigator.msSaveBlob(blob, fileName);
}
else {
let link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
link.click();
setTimeout(function () {
window.URL.revokeObjectURL(url);
}, 0);
}
对于非IE浏览器(“else”语句),我也能够成功使用
let reader = new FileReader();
reader.onloadend = function () {
window.location.href = reader.result;
};
reader.readAsDataURL(blob);
对于第二种方法,blob类型为application/octet-stream
非常重要,否则对于类似application/json
或text/csv
的内容,它将在新窗口/选项卡中打开文件。缺点是您无法提供文件名或扩展名,因此您将获得一个名为“download”的原始文件。