vue中js文件下载

227 阅读2分钟

前端文件下载有两个模式:1.后端返回文件流,2.后端返回下载链接

后端返回文件流

文件流格式需要我们对二进制大对象有一定的了解,首先来看

blob(binary large object)

二进制大对象,可存储二进制文件的容器

web领域,定义为只读数据类文件对象

构建一个Blob对象通常有三种方式:

1.通过Blob对象的构造函数来构建。

2.从已有的Blob对象调用slice接口切出一个新的Blob对象。

3.canvas API toBlob方法,把当前绘制信息转为一个Blob对象

1> var blob =new Blob(arry,options)

参1:数据序列

参2:要放入blob中的数据类型(MIME)

var blob = new Blob(["Hello World!"],{type:"text/plain"})

Blob对象的基本属性:

  • size :Blob对象包含的字节数。(只读)

  • type : Blob对象包含的数据类型MIME,如果类型未知则返回空字符串。

    Blob`对象的基本方法:**

    大文件分割 (slice() 方法),slice方法与数组的slice类似。

    不过目前浏览器实现此方法还没有统一,火狐使用的是 mozSlice() ,Chrome 使用的是 webkitSlice() ,其他浏览器则正常的方式 slice()

    function sliceBlob(blob, start, end, type) { type = type || blob.type; if (blob.mozSlice) { return blob.mozSlice(start, end, type); } else if (blob.webkitSlice) { return blob.webkitSlice(start, end type); } else { throw new Error("This doesn't work!"); } }

    MIME(Multipurpose Internet Mail Extensions)

    是描述消息内容类型的因特网标准。

    MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

实际运用

          axios.post("",pramas,{responseType: 'blob'}).then(res=>{
          var blob = new Blob([res.data], {type: 'application/vnd.ms-excel'});
          var downloadElement = document.createElement('a');
          var href = window.URL.createObjectURL(blob); // 创建下载的链接
          downloadElement.href = href;
          let name=Date.parse(new Date());
          downloadElement.download = name+'.xlsx'; // 下载后文件名
          document.body.appendChild(downloadElement);
          downloadElement.click(); // 点击下载
          document.body.removeChild(downloadElement); // 下载完成移除元素
          window.URL.revokeObjectURL(href); // 释放掉blob对象
           })

后端返回下载链接

axios.post("",pramas).then(res=>{

let url = (返回地址)
let link = document.createElement('a')
 link.style.display = 'none'
 link.href = url
link.setAttribute('download',  "下载.xls")
document.body.appendChild(link)
 link.click()
 window.URL.revokeObjectURL(href);//释放blob
})

返回图片(验证码图片)

  this.codeImg = 'data:image/png;base64,' + btoa(new Uint8Array(data.data).reduce((data, byte) => data + String.fromCharCode(byte), ''))