通过axios调接口实现导出文件的方法,并且可以随意命名

需求:如题,按一个按钮导出文件。
遇到的坑:1:window.open()打开链接请求接口下载下来,但是需要把请求头写在header上,我百度好久也没看到相关的技术。

解决方法:用new Blob接收后端的文件流,再开个隐藏的链接自动下载

一:封装一个统一处理导出文件的处理方法,download属性可以随便改文件名

//封的方法
export function download(data, name = "excel表.xlsx") {
    if (!data) {
        return;
    }
    let url = window.URL.createObjectURL(new Blob([data]));
    let link = document.createElement('a');
    link.style.display = 'none';
    link.href = url;
    link.setAttribute('download', name);
    document.body.appendChild(link);
    link.click();
}

二:照常调接口,通过axios配请求头

注意:要声明一下数据类型,responseType: 'blob’

// 照常调接口
export const memberTypeExcel= (params) => {
    return request({
        url: '/memberTypeExcel/excel',
        method: 'get',
        params,
        responseType: 'blob',

    })
}

三:页面可以直接用了,完美解决
import { download } from "@/util/export";
handleExcel() {
      memberTypeExcel(this.excel).then(res => {
        download(res.data, "考勤报表");
      });
    },

思考:文件名后台已经写好了,能不能我不取名,文件自己用后台的名字?
尝试:给new Blob指定类型,再把download属性置空(不提前指定就会默认是txt),但是文件名是随机数,失败
fe3e2df2-3b33-43b2-8452-3a62aaac43ae.xls


export function download(data) {
    if (!data) {
        return;
    }
    let url = window.URL.createObjectURL(new Blob([data], { type: "application/vnd.ms-excel" }));
    let link = document.createElement('a');
    link.style.display = 'none';
    link.href = url;
    link.setAttribute('download', '');
    document.body.appendChild(link);
    link.click();
}

还是直接拿后台的数据给他赋个名字吧
后台返的数据

在这里插入图片描述

handleExcel() {
      memberTypeExcel(this.excel).then(res => {
        // encodeURI('XXX')--把非英文字符转化为英文编码
        // decodeURI('XXX')--把转化后的英文编码转化回来
        let excelName = decodeURI(
          res.headers["content-disposition"].split("=")[1]
        );
        download(res.data, excelName);
      });
    },

解决。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,axios不通本地接口可能有以下几个原因: 1. 跨域问题:跨域是指在浏览器,当一个请求的域名、端口或协议与当前页面的域名、端口或协议不一致时,就会发生跨域。你提到使用了node的cors间件和nginx来实现跨域,但问题仍然存在。可能需要检查跨域配置是否正确,例如是否允许了请求的来源域名。 2. 接口失败重试:你提到参考了百度链接axios接口失败重试方法。可以尝试在axios请求失败时进行重试,以确保接口能够通。可以使用axios的interceptors拦截器来实现重试逻辑。 3. 回函数的this问题:你提到在axios函数无法访问到data的数据。这是因为回函数的this已经改变了。可以将this保存起来,然后在回函数直接使用保存的this来访问data的数据。 4. 数据来源问题:你提到axios和本地应用的最大区别是数据来源的改变,即通过网络接口获取数据。可能需要确保本地接口的地址和参数正确,并且能够正常返回数据。 以下是一个使用axios用本地接口的示例代码: ```javascript import axios from 'axios'; axios.get('/api/data') .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 请注意,上述代码的`/api/data`是一个示例接口地址,你需要根据实际情况修改为你的本地接口地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值