前端下载综合分析(上)

131 阅读2分钟

批量下载,大文件下载以及单文件,都是通用项目中常见的模块功能。 以下是项目中用到的下载方面的一些心得代码

1- 文件流预览+下载+类型判断

单个文件流下载是常用的的方法,预览时根据不同类型判断展现

yulanAxios(firstId, state) {
      let token = this.token;

      let params = {
        nodeInstGuid: firstId,
        token: token,
      };
      let url = "www.baidu.com";//你的地址
      let head = {
        "X-Gisq-Token": "Bearer " + token,
        "Content-Type": "application/json",
      };
      axios
        .post(url, JSON.stringify(params), {
          responseType: "blob",//必要
          headers: head,
        })
        .then((res) => {
          // 处理返回的文件流
          const blob = new Blob([res.data]);//注意返回的文件流格式
          const elink = document.createElement("a");
          let fileName = this.selectName;//这里是附件名称
          //截取附件类型,如果后端返回文件名的话
          var fileType = fileName.split('.').pop().toLowerCase();
          // 根据附件类型筛选方法
          elink.download = fileName;
          elink.style.display = "none";
          elink.href = URL.createObjectURL(blob);
          //下面是类型区分,区分预览的img,pdf如果用不到可以直接跳到第二步
          if (state == 1) {
            this.dialogVisible = true;
            if(fileType == 'jpg' || fileType == 'png' || fileType == 'jpeg'){
              //图片
              this.filetype = 1;
              let fileURL = window.URL.createObjectURL(blob);
              this.fileimgUrl = fileURL;
            }else if(fileType == 'pdf'){
              //预览
              this.filetype = 2;
              this.url = elink.href;
            }else {
                this.filetype = 3;
            }
          } else {
            //第二步,如果不支持预览直接下载
            document.body.appendChild(elink);
            elink.click();
            URL.revokeObjectURL(elink.href); // 释放URL 对象
            document.body.removeChild(elink);
          }
        });
    }

2- 直接下载地址 批量下载

一般用在后端返回的是压缩包地址的情况下 tips:

  • 后端需要对特殊字符做处理 ,否则会出现nginx代理出空包的情况。
  • 成功返回地址却无法下载前端常用的是利用decodeURIComponent()对特殊字符处理
  • 也能用window.open,但是无法规避上述问题
  • 批量下载不可避免会遇到大文件,需要利用切片或者websocket方式进行上传。中篇会介绍前端websocket的上传方式
         const linkNode = document.createElement("a");
                  linkNode.style.display = "none";
                  linkNode.href = msgJson.fileUrl;
                  //关键:自定义返回的压缩包名称,规避了后端返回中文地址出现%等情况
                  linkNode.download = decodeURIComponent(this.xmmc)+'.zip';

                  document.body.appendChild(linkNode);
                  linkNode.click();
                  document.body.removeChild(linkNode);
                  this.loading = false;
                  URL.revokeObjectURL(linkNode.href);

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天 点击查看活动详情