Angular / Vue HTTP POST 下载流文件
HTTP POST 申请流文件转成 excel
在应用 Angular 开发我的项目时,通常会有下载文件的性能项。个别是后盾返回下载地址,通过 <a>
题目或者应用 window
关上下载地址新窗口,浏览器则会辨认出流文件进行文件下载。
然而,有时候进行 http 异步申请,后盾返回的并不是下载地址,而是间接返回一个文件流,这时如何应用 http 申请回来的文件流转换成文件下载?
其实并非 Angular 框架存地这样的状况,其余 PWA 如 Vue,React 甚至 Jquery 都通过 http xhr 进行申请而获取的流文件,浏览器也并不会自动识别并主动下载。
那当然,必定有解决方案。
计划思路:
- http 申请应用 blob 的返回类型,
- 获取文件流后,对数据进行
Blob
, - 再提交给浏览器进行辨认下载。
上面是代码示例
/**
* 导出 excel
*/
exportExcel(){const params = {}; // body 的参数
const queryParams = undefined; // url query 的参数
this.http.post(this.exportUrl, params, queryParams, {
responseType: "blob",
headers: new HttpHeaders().append("Content-Type", "application/json")
}).subscribe(resp=>{
// resp: 文件流
this.downloadFile(resp);
})
}
/**
* 创立 blob 对象,并利用浏览器关上 url 进行下载
* @param data 文件流数据
*/
downloadFile(data) {
// 下载类型 xls
const contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
// 下载类型:csv
const contentType2 = 'text/csv';
const blob = new Blob([data], {type: contentType});
const url = window.URL.createObjectURL(blob);
// 关上新窗口形式进行下载
// window.open(url);
// 以动态创建 a 标签进行下载
const a = document.createElement('a');
const fileName = this.datePipe.transform(new Date(), 'yyyyMMdd');
a.href = url;
// a.download = fileName;
a.download = fileName + '.xlsx';
a.click();
window.URL.revokeObjectURL(url);
}