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

本文介绍了一种在前端实现文件导出的方法,包括使用newBlob处理后端文件流,通过axios配置请求头,并封装了一个通用的文件下载函数,解决了直接使用window.open()的局限性。

需求:如题,按一个按钮导出文件。
遇到的坑: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);
      });
    },

解决。

在Vue3前端,通过axios用后端接口下载Excel文件通常会涉及以下几个步骤: 1. 安装axios库:首先确保已经在项目中安装了axios,如果没有可以运行`npm install axios` 或者 `yarn add axios`。 2. 创建下载链接:后端需要提供一个HTTP响应,该响应应该包含一个名为"Content-Disposition"的头信息,用于指定文件名,并将内容设置为二进制Excel数据。例如,你可以使用`Content-Type: application/vnd.ms-excel`来指定Excel格式。 ```javascript // 假设你的后端API路径是'/api/download-excel' const downloadUrl = '/api/download-excel'; // 使用axios发起GET请求 axios.get(downloadUrl) .then(response => { // 检查响应状态码,一般200表示成功 if (response.status === 200) { // 设置正确的Content-Disposition头信息和Content-Type const filename = 'example.xlsx'; // 文件名 response.headers['Content-Disposition'] = `attachment; filename=${encodeURIComponent(filename)}`; // 创建Blob对象,并创建下载链接 const blob = new Blob([response.data], {type: 'application/vnd.ms-excel'}); const url = URL.createObjectURL(blob); // 创建隐藏的a标签并触发点击事件下载文件 const link = document.createElement('a'); link.href = url; link.download = filename; link.click(); // 清理URL对象 setTimeout(() => URL.revokeObjectURL(url), 0); } else { console.error('Failed to download Excel file.', response); } }) .catch(error => { console.error('Error downloading Excel file:', error); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值