1. 程式人生 > 其它 >vue,elementui更改檔名下載,並新增el-progress進度條

vue,elementui更改檔名下載,並新增el-progress進度條

技術標籤:vueJavaScriptvue.jsnode.jsjavascript

功能:vue,elementui更改檔名下載,下載新增el-progress進度條。

需求:公司需要下載fastdfs檔案系統檔案(通過http方式),並修改下載的檔名,ps:跨域問題通過配置nginx解決。

下載元件程式碼如下:

<template>
  <div id="download" ref="downloada">
    <el-dialog title="下載中" :visible.sync="isShow" :before-close="stopDownload"
     width="12.5%">
      <el-progress type="circle" :percentage="percentage"></el-progress>
    </el-dialog>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        percentage: 0,
        dialogVisible: false,
        isShow: false,
        xhr: {}
      }
    },
    methods: {
      onload: function(url, name, type) {
        this.percentage = 0
        this.isShow = true
        //也可以下載其他格式檔案
        //if (url.indexOf("https") < 0) {
        //  url = url.replace("http:", "https:");
        //}
        url = url + "?time=" + new Date().getTime()
        if (type == 'jpg' || type == 'jpeg' || type == 'png') {
          this.ddd(url, name, type)
        } else {
          this.fileLinkToStreamDownload(url, name, type)
        }
      },
      ddd(src, name, type) {
        var canvas = document.createElement('canvas');
        canvas.setAttribute("crossOrigin", '*');
        var img = document.createElement('img');
        img.setAttribute('crossOrigin', 'anonymous');
        img.src = src;
        let _this = this;
        img.onload = function(e) {
          canvas.width = img.width;
          canvas.height = img.height;
          var context = canvas.getContext('2d');
          context.drawImage(img, 0, 0, img.width, img.height);
          canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
          _this.downs(canvas.toDataURL(type == 'jpg' ? 'image/jpeg' : type == 'jpeg' ? 'image/jpeg' : type == 'png' ?
            'image/png' : ''), name, img)
          _this.isShow = false
        }
      },
      downs(url, name, img) {
        let a = document.createElement("a")
        let imgURL = url;
        let ua = navigator.userAgent;
        if (ua.indexOf("Trident") != -1 && ua.indexOf("Windows") != -1) { // IE核心 並且  windows系統 情況下 才執行;
          var bstr = atob(imgURL.split(',')[1])
          var n = bstr.length
          var u8arr = new Uint8Array(n)
          while (n--) {
            u8arr[n] = bstr.charCodeAt(n)
          }
          var blob = new Blob([u8arr])
          window.navigator.msSaveOrOpenBlob(blob, name)
        } else if (ua.indexOf("Firefox") > -1) { //火狐相容下載
          let blob = this.base64ToBlob(imgURL); //new Blob([content]);
          let evt = document.createEvent("HTMLEvents");
          evt.initEvent("click", true, true); //initEvent 不加後兩個引數在FF下會報錯  事件型別,是否冒泡,是否阻止瀏覽器的預設行為
          a.download = ' ';
          a.href = URL.createObjectURL(blob);
          a.dispatchEvent(new MouseEvent('click', {
            bubbles: true,
            cancelable: true,
            view: window
          })); //相容火狐
        } else { //谷歌相容下載
          img.src = imgURL;
          a.href = img.src
          //設定下載檔案的名字
          a.download = name
          //點選
          a.click()
        }
        img.onload = null; //防止一直迴圈
      },
      //base64轉blob
      base64ToBlob(code) {
        let parts = code.split(';base64,');
        let contentType = parts[0].split(':')[1];
        let raw = window.atob(parts[1]);
        let rawLength = raw.length;
        let uInt8Array = new Uint8Array(rawLength);
        for (let i = 0; i < rawLength; ++i) {
          uInt8Array[i] = raw.charCodeAt(i);
        }
        return new Blob([uInt8Array], {
          type: contentType
        });
      },
      //pdf下載
      fileLinkToStreamDownload(url, fileName, type) {
        this.xhr = new XMLHttpRequest();
        this.xhr.open('get', url, true);
        this.xhr.setRequestHeader('Content-Type', 'application/${type}');

        this.xhr.responseType = "blob";
        let _this = this;
        this.xhr.onload = function() {
          if (this.status == 200) {
            //接受二進位制檔案流
            var blob = this.response;
            let ua = navigator.userAgent;
            if (ua.indexOf("Trident") != -1 && ua.indexOf("Windows") != -1) { // IE核心 並且  windows系統 情況下 才執行;
              navigator.msSaveBlob(blob, fileName)
            } else if (ua.indexOf("Firefox") > -1) { //火狐相容下載
              _this.downloadExportFile(blob, fileName, type)
            } else { //谷歌相容下載
              _this.downloadExportFile(blob, fileName, type)
            }
          }
        }
        this.xhr.addEventListener("progress", this.progressFunction, false);
        this.xhr.send();
      },
      downloadExportFile(blob, tagFileName, fileType) {
        let downloadElement = document.createElement('a');
        let href = blob;
        if (typeof blob == 'string') {
          downloadElement.target = '_blank';
        } else {
          href = window.URL.createObjectURL(blob); //建立下載的連結
        }
        downloadElement.href = href;
        downloadElement.download = tagFileName; //下載後文件名
        this.$refs.downloada.appendChild(downloadElement);
        downloadElement.click(); //點選下載
        this.$refs.downloada.removeChild(downloadElement);

        if (typeof blob != 'string') {
          window.URL.revokeObjectURL(href); //釋放掉blob物件
        }
        this.isShow = false
      },
      //上傳進度實現方法,上傳過程中會頻繁呼叫該方法
      progressFunction(evt) {
        if (evt.lengthComputable) {
          var percentComplete = evt.loaded / evt.total;
          let num = percentComplete * 100
          this.percentage = parseFloat(num.toFixed(2))
        }
      },
      stopDownload() {
        if (this.xhr && this.isShow == true) {
          this.$confirm('此操作將停止下載, 是否繼續?', '提示', {
            confirmButtonText: '確定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            this.xhr.abort()
            this.isShow = false
          }).catch(() => {
            this.$message({
              type: 'info',
              message: '已取消停止下載'
            });
          });
        }
      }
    }
  }
</script>
<style lang="scss">
  #download {
    .el-progress-circle {
      height: 200px !important;
      width: 200px !important;
    }
    .el-dialog {
      display: flex;
      flex-direction: column;
      margin: 0 !important;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      max-height: calc(100% - 30px);
      max-width: calc(100% - 30px);
    }
    .el-dialog .el-dialog__body {
      flex: 1;
      overflow: auto;
    }
  }
</style>

父元件呼叫程式碼:

1.html程式碼

<download ref="dl"></download>

2.js程式碼

 import download from '@/components/download'
  export default {
    components: {
      download
    },
   
    methods: {
      download: function() {
         let url='http://XXXX:8882/group1/M00/00/40/Cnd7o1_8CIGAAITLBL5QnGH9z8I834.zip'
        let name = '第二代行動式消防水帶現場檢測裝置應用視訊.zip'
        let type = 'zip'
        let vm = this
        vm.$nextTick(() => {
          vm.$refs.dl.onload(url, name, type);
        });
      }
    }
  }