axios请求获取excel文件,结果excel里的内容是response体的内容

需求是页面有个下载功能,下载的目标文件是excel文件,我用axios请求接口,请求成功,可以获取excel文件,但是excel文件里的内容不正确,excel里的内容是接口返回的响应体内容,一串长长的字符串,而不是正确的excel内容

export function getBlobRequest(url, params = {}) {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params,
            responseType: 'blob' //返回数据的格式,可选值为arraybuffer,blob,document,json,text,stream,默认值为json
        })
        .then(response => {
            resolve(response);
        })
        .catch(err => {
            console.log(`接口调用失败`);
            Message.error({message: '网络异常,请稍后再试!'});
            reject(err);
        })
    })
}

blob解析代码

if (!data) {
        return;
    }
    let head = data.headers['content-disposition'];
    let type = data.headers['content-type'];
    console.log(type)
    let url = window.URL.createObjectURL(new Blob([data.data], {type: type}));

    let fname = '';
    if (head) {
        try {
            fname = head.split(';')[2].split('=')[1];
            let reg = new RegExp('"',"g");
            fname = fname.replace(reg, "");
        }catch (err){
            console.log('can not get pdf name');
        }

    }

    let link = document.createElement('a');
    link.style.display = 'none';
    link.href = url;
    link.setAttribute('download', fname);
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link); //下载完成移除元素
    window.URL.revokeObjectURL(url); //释放掉blob对象

图片描述

阅读 5.5k
3 个回答

后端返回excel的地址,你下载就行了

你请求的是blob,返回的内容也没有错(只要你程序没有问题)
但是blob 是被浏览器加载,默认不会下载到本地的,你要做的就是把这个blob写入到本地,直接写肯定是不行的,因为浏览器安全限制的原因,但还是有变通的办法的,给一个小例子

var saveData = (function () {
    var a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    return function (data, fileName) {
        var json = JSON.stringify(data),
            blob = new Blob([json], {type: "octet/stream"}),
            url = window.URL.createObjectURL(blob);
        a.href = url;
        a.download = fileName;
        a.click();
        window.URL.revokeObjectURL(url);
    };
}());

var data = { x: 42, s: "hello, world", d: new Date() },
    fileName = "my-download.json";

saveData(data, fileName);

以上代码 构建了一个json文件的blob 并实现下载,

刚实现的需求。 不用form表单,想用ajax实现下载的话, 百度搜索 js-file-download

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题