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);}