美文网首页
react +antdesign_pro做的导出

react +antdesign_pro做的导出

作者: 年轻人多学点 | 来源:发表于2020-12-29 00:48 被阅读0次

1.点击链接

数据、文件格式全部在后台封装好,返回给前端一个链接,前端通过点击链接自动下载,两种方式:

1 (1)window.location.href = ‘url’
2 (2)<a href='url' download=''></a>

2.解析后台返回的文件流

这种方式就是后台将要导出的文件以文件流的方式返回给前端,前端通过blob去解析,再动态创建a标签。

demo1
// 发请求
this.axios.post(url, {param: paramName}, {responseType: 'arraybuffer'}).then(res => {
    let content = res.data; // 文件流
    let blob = new Blob([content],{type: 'application/octet-stream'});
    let fileName = 'filename.xls';
    // 如果后端返回文件名
    // let contentDisposition = res.headers['content-disposition'];
    // let fileName = decodeURI(contentDisposition.split('=')[1]);
        if ('download' in document.createElement('a')) {  // 非IE下载
        let link = document.createElement('a');
        link.download = fileName;
        link.style.display = 'none';
        link.href = URL.createObjectURL(blob);
        document.body.appendChild(link);
        link.click();
        URL.revokeObjectURL(link.href) ; // 释放URL 对象
        document.body.removeChild(link);
    } else {  // IE10+下载
      navigator.msSaveBlob(blob,fileName);
    }
})

demo2基于react
function exportFile(url, data) {
    axios({
        method: 'post',
        url: url,
        data: data,
        responseType: 'blob'
    }).then((res) => {
        const content = res.data;
        const blob = new Blob([content]);
        const fileName = "导出数据.xls";
        const selfURL = window[window.webkitURL ? 'webkitURL' : 'URL'];
        let elink = document.createElement('a');
        if ('download' in elink) {
            elink.download = fileName;
            elink.style.display = 'none';
            elink.href = selfURL['createObjectURL'](blob);
            document.body.appendChild(elink);

            // 触发链接
            elink.click();
            selfURL.revokeObjectURL(elink.href);
            document.body.removeChild(elink)
        } else {
            navigator.msSaveBlob(blob, fileName);
        }
    })
}

后续bug遇到的是下载文件乱码
文件下载后内容乱码的主要原因是没有设置responseType,因为构造blob不知道何种原因总是对于构造后的数据是乱码的。
因为存储从服务去返回的二进制文件流就必须要永达blob,但是接口自主构造却不行,所以这里就只能让响应实体返回blob,在请求的config中设置responseType:‘blob’,这样的会就会在response中返回blob,但是这个blob是data,而不是像feach中是个单独的方法。

解决办法:responseType:‘blob’

相关文章

网友评论

      本文标题:react +antdesign_pro做的导出

      本文链接:https://www.haomeiwen.com/subject/luixoktx.html