下载的几种情况

下载的几种方式

前端本地文件下载

//activeNameProp 指的文件可以变化的前缀名字,根据需求写死名字也可

> url:是文件地址

download() {
      let url = '';
      if(this.activeNameProp == '数据资源') {
         url = '数据资源模板.xlsx';
      }
      if(this.activeNameProp == '模型资源') {
        url = '模型资源模板.xlsx';
      }
      if(this.activeNameProp == '知识资源') {
         url = '知识资源模板.xlsx';
      }
      if(url) {
        let fileName = this.activeNameProp + '条目报表.xlsx';
        const a = document.createElement('a');
        const name = fileName || '';
        a.href = url;
        a.download = name;
        a.click();
        a.remove();
      }
    },

后端导出

后端返的文件流

 axios({
             method: "get",
             url: `${process.env.VUE_APP_BASE_API}/metadata/basin/getMetaCatalogExport`,
             async: true,
             params:this.form,
             headers: {
             "Content-Type": "application/json;charset=utf-8",
             Authorization: getToken(),
             },
             responseType: 'blob'
      }).then(response => {
    const blob = new Blob([response.data]);
    const url = URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = url;
    link.download = 'XXX.xlsx';
    link.click();
  });

走后端的接口1


> url:文件地址

 downloadURl(url) {
       this.$message.info('开始下载文件')
        this.$refs.downloadRef.download(url);
      axios({
        url: process.env.VUE_APP_BASE_API + "/v1/minio/tasks/download",
        method: "post",
        data: { identifier: url },
        responseType: "blob",
        headers: {
          authorization: getToken(),
        },
      }).then((res) => {
        const link = document.createElement("a"); // 创建a标签
        var index = url.lastIndexOf("/");
        var suffix = url.substring(index + 1);
        link.download = suffix; //res.headers["content-disposition"] &&  decodeURIComponent(res.headers["content-disposition"].split("=")[1]);
        link.href = window.URL.createObjectURL(
          new Blob([res.data], { type: "application/octet-stream" })
        );
        link.click();
        // URL.revokeObjectURL(url); // 释放内存
      });
    },

走后端的接口2

 download(url) {
 > url:文件地址
      this.$message.info('开始下载文件,请等待!')
        // getLink(url).then((res) => {    //word
        //       const filestream=res.replace('http: //','http://')  // 返回的文件流
                axios({
                  url: process.env.VUE_APP_BASE_API + "/common/download/resource",
                  method: "get",
                  params: { resource: url },
                  responseType: "blob",
                  headers: {
                    authorization: getToken(),
                  },
                }).then((res) => {
                  const link = document.createElement("a"); // 创建a标签
                  var index = url.lastIndexOf("/");
                  var suffix = url.substring(index + 1);
                  link.download = suffix; //res.headers["content-disposition"] &&  decodeURIComponent(res.headers["content-disposition"].split("=")[1]);
                  link.href = window.URL.createObjectURL(
                    new Blob([res.data], { type: "application/octet-stream" })
                  );
                  link.click();
                  // URL.revokeObjectURL(url); // 释放内存
                });
                      // })
    },

走后端的接口且分片

是一个组件

<template>
  
</template>
<script>
import axios from "axios";
import { getToken } from "@/utils/auth";
import Bus from '@/utils/bus';
export default {
  data() {
    return {
      timer: null, //定时器名称
    };
  },
  watch: {},
  methods: {
    // 分段下载
    async download(downloadUrl) {
      let percentage = 0;
      let contentList = []; // 文件流数组
      let filesCurrentPage = 0; //文件开始偏移量
      let fileFinalOffset = -1; //文件最后偏移量
      // const chunkSize = 1024 * 100; // 单个分段大小,这里测试用1M
      const chunkSize = 1024 * 1024 * 20; // 单个分段大小,这里测试用1M
      let filesTotalSize = 0; // 安装包总大小,默认100M
      let filesPages = 1; // 总共分几段下载
      let res = await axios({
        method: "post",
        url: `${process.env.VUE_APP_BASE_API}/v1/minio/tasks/splitDownloadGetFileSize`,
        async: true,
        data: {
          chunkSize: 0,
          fileName: "",
          identifier: downloadUrl,
          totalSize: 0,
          // inline:'inline'
        },
        headers: {
          "Content-Type": "application/json;charset=utf-8",
          Authorization: getToken(),
        },
      });
      filesTotalSize = res.data.data;
      let sentAxios = (num) => {
        let rande = chunkSize;

        //判断是否开启了断点续传(断点续传没法并行-需要上次请求的结果作为参数)
        // if (this.breakpointResumeTags) {
        let endNum = num * chunkSize + 1;
        if (endNum > filesTotalSize) {
          endNum = "";
        }
        rande = `bytes=${Number(fileFinalOffset) + 1}-${endNum}`;
        // }
        // else {
        //   if (num) {
        //     rande = `bytes=${(num - 1) * chunkSize + 2}-${num * chunkSize + 1}`;
        //   } else {
        //     // 第一次0-1方便获取总数,计算下载进度,每段下载字节范围区间
        //     rande = "bytes=0-1";
        //   }
        // }

        let headers = {
          Range: rande,
          "Content-Type": "application/json;charset=utf-8",
          Authorization: getToken(),
        };

        axios({
          method: "post",
          url: `${process.env.VUE_APP_BASE_API}/v1/minio/tasks/splitDownload`,
          async: true,
          data: {
            chunkSize: 0,
            fileName: "",
            identifier: downloadUrl,
            // "identifier": "http://10.1.8.35:9000/htht/2023-04-24/上传文件夹.zip",
            totalSize: 0,
          },
          headers: headers,
          responseType: "blob",
        })
          .then((response) => {
            if (response.status == 200 || response.status == 206) {
              //检查了下才发现,后端对文件流做了一层封装,所以将content指向response.data即可
              const content = response.data;
              //截取文件总长度和最后偏移量
              let result = response.headers["content-range"].split("/");
              // 获取文件总大小,方便计算下载百分比
              filesTotalSize = result[1];
              //获取最后一片文件位置,用于断点续传
              fileFinalOffset = result[0].split("-")[1];
              // 计算总共页数,向上取整
              filesPages = Math.ceil(filesTotalSize / chunkSize);
              // 文件流数组
              contentList.push(content);
              // 递归获取文件数据(判断是否要继续递归)
              if (filesCurrentPage < filesPages) {
                filesCurrentPage++;
                //计算下载百分比  当前下载的片数/总片数
                percentage = Number(
                  (contentList.length / filesPages) * 100
                ).toFixed(2);
                if (percentage == 100) {
                  percentage = 0;
                  this.$notify({
                    title: "成功",
                    message: "文件下载完成!",
                    type: "success",
                  });
                }
                this.$root.$emit("percentage", percentage);
                sentAxios(filesCurrentPage);
                //结束递归
                return;
              }
              // 文件下载
              const fileName = decodeURIComponent(
                response.headers["content-disposition"].split("filename=")[1]
              );
              //构造一个blob对象来处理数据
              const blob = new Blob(contentList);
              //对于<a>标签,只有 Firefox 和 Chrome(内核) 支持 download 属性
              //IE10以上支持blob但是依然不支持download
              if ("download" in document.createElement("a")) {
                //支持a标签download的浏览器
                const link = document.createElement("a"); //创建a标签
                link.download = fileName; //a标签添加属性
                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 {
                //其他浏览器
                navigator.msSaveBlob(blob, fileName);
              }
            } else {
              //调用暂停方法,记录当前下载位置
              this.$notify.error({
                title: "失败",
                message: "文件下载失败,请稍后重试或联系管理员",
              });
              console.log("下载失败");
            }
          })
          .catch(function (error) {
            this.$notify.error({
              title: "失败",
              message: error || "文件下载异常,请稍后重试或联系管理员",
            });
            console.log(error);
          });
      };
      // 第一次获取数据方便获取总数
      sentAxios(filesCurrentPage);
      this.$notify({
        title: "成功",
        message: "文件开始下载!",
        type: "success",
      });
    },
  },
};
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值