You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中如何通过HttpClient获取响应模型内的Blob数据

解决Angular中提取接口data字段生成Excel文件的问题

你的问题核心是接口返回的是JSON结构,而你直接将整个响应作为Blob处理,导致保存的文件包含了完整的响应内容。正确的做法是先解析JSON响应,提取data中的base64编码内容,再将其转换为Blob生成Excel文件。

步骤1:修改HttpClient请求,先获取JSON响应

去掉responseType: 'blob'配置,先接收完整的JSON响应,再提取目标数据:

return this.httpClient
  .post(`${this.apiURL}user/transaction/generate/excel/filtered/order`, body, { headers: this.headers })
  .pipe(
    map((response: any) => {
      // 提取接口返回的data字段
      const excelData = response.data;
      
      // 将base64字符串转换为Uint8Array
      const decodedData = atob(excelData.body);
      const uint8Array = new Uint8Array(decodedData.length);
      for (let i = 0; i < decodedData.length; i++) {
        uint8Array[i] = decodedData.charCodeAt(i);
      }
      
      // 获取正确的Content-Type,也可以直接指定Excel类型
      const contentType = excelData.headers['Content-Type'][0] || 'application/vnd.ms-excel;charset=UTF-8';
      
      // 生成Blob对象
      return new Blob([uint8Array], { type: contentType });
    }),
    catchError(this.errorHandl)
  );

步骤2:使用Blob生成并保存Excel文件

当你拿到上述代码返回的Blob后,可以通过原生DOM方法保存文件:

// 假设你已经订阅了上述请求并拿到blob
saveExcelFile(blob: Blob) {
  const downloadUrl = window.URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = downloadUrl;
  link.download = '交易数据.xlsx'; // 自定义文件名
  document.body.appendChild(link);
  link.click();
  
  // 清理资源
  window.URL.revokeObjectURL(downloadUrl);
  document.body.removeChild(link);
}

错误原因说明

你之前设置responseType: 'blob',Angular会直接把接口返回的JSON文本当成二进制数据封装成Blob,保存后自然是完整的响应JSON内容。而接口实际返回的是包含base64编码Excel数据的JSON结构,必须先解析JSON,再将base64字符串转换为真正的二进制Blob。

内容的提问来源于stack exchange,提问作者Ineludible

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:45:14