【VUE+ElementUI】通过接口下载blob流文件设置全局Loading加载进度

下载Blob流文件,并以服务形式显示文件下载进度

1、下载接口 增加 config参数,并用...config将该属性加入到请求中;

xxapi.js文件中设置downloadFile下载接口

javascript 复制代码
// 下载文件
export function downloadFile(data, config) {
  return request({
    url: '/xx/downloadFile',
    method: 'post',
    data: data,
    responseType: 'blob',
    timeout: 120 * 60 * 1000,
    ...config
  })
}

2、在页面中添加以下代码

html 复制代码
<el-button type="text" icon="el-icon-download" @click="handleDownload(scope.row)">下载</el-button>
javascript 复制代码
<script>
import { downloadFile } from "@/api/xxapi";
import { Loading } from 'element-ui'
let downloadLoadingInstance;

export default {
  name: "DownloadFile",
  data() {
    return {
      downloadProgress: 0
    }
  },
  methods: {
    handleDownload(row) {
      var that = this;
      downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候 " + that.downloadProgress + '%', spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
      const config = {
        onDownloadProgress: progressEvent => {
          if (progressEvent.lengthComputable) {
            that.downloadProgress = Math.round((progressEvent.loaded / progressEvent.total) * 100);
            downloadLoadingInstance.text = "正在下载数据,请稍候 " + that.downloadProgress + '%';
          }
        }
      };
      // 从后端请求到 二进制数据,并由后端转成blob
      downloadFile({ url: row.url }, config).then((response) => {
        let downloadName = `${row.fileName}`;
        this.downloadBlob(response, downloadName); // 二进制流直接取response
        downloadLoadingInstance.close(); // 关闭加载loading效果
      });
    },
    // 下载文件流格式的文件
    downloadBlob(response, downloadName) {
      let blob = new Blob([response], {
        type: "application/json;charset=utf-8",
      });
      let href = window.URL.createObjectURL(blob); // 创建下载的链接
      if (window.navigator.msSaveBlob) {
        try {
          window.navigator.msSaveBlob(blob, downloadName);
        } catch (e) {
          console.log(e);
        }
      } else {
        // 谷歌浏览器 创建a标签 添加download属性下载
        let downloadElement = document.createElement("a");
        downloadElement.href = href;
        downloadElement.target = "_blank";
        downloadElement.download = downloadName; // 下载后文件名
        document.body.appendChild(downloadElement);
        downloadElement.click(); // 点击下载
        document.body.removeChild(downloadElement); // 下载完成移除元素
        window.URL.revokeObjectURL(href); // 释放掉blob对象
      }
    }
  }
}
</script>
相关推荐
GIS之路27 分钟前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide36 分钟前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
ssshooter1 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸2 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
Live000002 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉2 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化
兆子龙3 小时前
从高阶函数到 Hooks:React 如何减轻开发者的心智负担(含 Demo + ahooks 推荐)
前端
狗胜3 小时前
测试文章 - API抓取
前端
三小河3 小时前
VS Code 集成 claude-code 教程:告别海外限制,无缝对接国内大模型
前端·程序员