前端实现后端post请求返回的数据流下载excel显示无法打开,axiox请求封装加responseType属性

本文讲述了作者在处理项目需求时遇到的挑战,从使用UMI框架的默认GET请求导出转变为POST请求,并解决了如何正确设置responseType为arraybuffer以下载数据的问题。作者通过引入Axios并进行封装来确保数据以正确的格式下载。
摘要由CSDN通过智能技术生成

 今天做需求又是平平无奇的导出,以往项目框架里都是后端的get请求导出,

然后前端直接window.open(`地址 ', '_self')就可以实现下载了,

而今天突然来了个post请求的导出,直接用原来封装的post请求下载后获取的数据流

  非常尴尬的情况出现了

看一下现在导出的代码
this.props.dispatch({
  type: 'homePage/exportDeptRecordQuality',
  payload: {
    startTime: startTime || '2022-08-01',
    endTime: endTime || '2023-08-01',
  },
}).then((res: any) => {
  if (res) {
    console.log(res, 'res')
    const datas = res;
    const url = window.URL.createObjectURL(new Blob([datas], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }))
    const link = document.createElement('a')
    link.style.display = 'none'
    link.href = url;
    link.setAttribute('download', '病历基本信息报表22');
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link);
  }
})

 看了一下现在的项目请求封装是umi自带的,没有用老朋友axiox    

 猜测原因也许可能是没代入responseType: 'arraybuffer'(ps:不确定umi框架中的请求封装是否有这个字段的判断值,有网友了解可以指出学习一下嘿嘿)

import { extend } from 'umi-request';
//更详细的 api 文档: https://github.com/umijs/umi-request

 这时候决定重新用老朋友axiox给他封个post请求 

 记得带上responseType: 'arraybuffer'

直接上代码  request.js 封装post请求

// 网络请求配置
import axios from "axios";
import { message } from 'antd'
axios.defaults.withCredentials = true;

// http request 拦截器
axios.interceptors.request.use(
  (config) => {
    config.data = JSON.stringify(config.data);
    config.headers = {
      "Content-Type": "application/json",
    };
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// http response 拦截器
axios.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    console.log("请求出错:", error);
  }
);

// 封装post请求
export function post(url, data, config) {
  return new Promise((resolve, reject) => {
    console.log(url, data, config)
    axios.post(url, data, config).then(
      (response) => {
        //关闭进度条
        resolve(response.data);
      },
      (err) => {
        reject(err);
      }
    );
  });
}

 请求调用函数封装 service.js'

很关键的来了!!!记得加入 responseType: 'arraybuffer

import { post } from "../../utils/request";

export function downTem(data: any) {
  console.log(data, 'data')
  return post(`${getServerPath()}/emr/exportDeptRecordQuality`, data, { responseType: 'arraybuffer' });
}

页面调用

downTem(data).then((res) => {
  const datas = res;
  const url = window.URL.createObjectURL(new Blob([datas], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }))
  const link = document.createElement('a')
  link.style.display = 'none'
  link.href = url;
  link.setAttribute('download', '病历基本信息报表');//文件名
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link);
})

成功导出打开文件

 

在jQuery中使用Ajax发送POST请求导出表格时,如果你需要将数据导出为文件(如CSV或Excel),后端通常会返回一个`Blob`对象或者`ArrayBuffer`。这是因为这两种数据类型可以直接用于创建文件下载。 - `Blob`(二进制大对象)是一个JavaScript内置对象,可以表示不可变、原始的数据,例如图片、音频或文本文件。它允许浏览器以流的形式处理大数据。 - `ArrayBuffer`是一个原始的、固定长度的、不可变的二进制数据结构,它是`Blob`的基础。后端可能会先将其转换成`ArrayBuffer`再返回。 当你从服务器获取到这两个其中之一时,可以在前端进行一些操作,比如: ```javascript $.ajax({ type: 'POST', url: '/export', data: yourFormData, processData: false, // 阻止jQuery默认处理数据 contentType: 'application/json', // 根据实际情况设置内容类型 success: function(response) { if (response instanceof Blob) { var blobURL = URL.createObjectURL(response); // 创建下载链接或使用HTML5 download属性 var a = document.createElement('a'); a.href = blobURL; a.download = 'yourFileName.csv'; // 设置下载名称 document.body.appendChild(a); a.click(); URL.revokeObjectURL(blobURL); // 下载完成后释放URL } else if (typeof response === 'object' && response.byteLength) { // 如果是ArrayBuffer var blob = new Blob([response], {type: 'application/octet-stream'}); // 同样地,这里创建下载链接 } }, error: function(xhr, status, error) { console.error('Export failed:', error); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值