这是我定义的后台接口

//导出数据接口
export function getZTPJExportData(data){
    return request({
        url:"/sxc/newEnergyPowerForecast/overallEvaluation/doExportData",
        method:"get",
        params:data,
        responseType:'blob',//将文件流转成blob对象
        noErrorMsg:true
    })
}

Vue页面代码

import {getZTPJExportData} from "../../../api/module/newEnergy"; //引入后台接口
methods里面的导出文件方法
//导出
ExportData(){
    getZTPJExportData({
        czlx: this.tabPositionName,
        dgfw: this.tabPositions,
        pdate: this.pdates,
        pdateType: this.pdateType,
        tjlx: this.tjlxName,
    }).then((response)=>{
        //处理返回的文件流
        const contentDisposition = response.headers['content-disposition'];
        var fileName;
        if (contentDisposition) {
            fileName = window.decodeURI(response.headers['content-disposition'].split('=')[1]);
        }
        const blob = new Blob([response.data])
        const link = document.createElement('a')
        link.href = window.URL.createObjectURL(blob)
        link.download = fileName
        document.body.appendChild(link)
        link.click()
        window.setTimeout(function() {
            window.URL.revokeObjectURL(blob)
            document.body.removeChild(link)
        }, 0)
    }).catch(() => {
    })
},

如果responseType设为blob的话,按理来说返回的文件流将会被转成blob对象,而不是文件流,但是无论怎么设置都没有转成blob对象,我后来才发现最坑的是mockjs的引入,前端在后端没有接口之前会使用mockjs,但是这个mockjs会影响responseType的设置转换,且拦截下载的数据最终导致乱码,项目中注释掉mockjs即可实现成功blob的转换。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐