获取后端传来的文件地址,将该文件转为Blob对象进行下载

1、前言:

  如果后端传来的是Blob二进制流,

  

 

  二进制流就长这个样子,可以利用 new Blob() 获取blob对象:

  let blob = new Blob([data.data], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' })

  提示:type的值为application/vnd.openxmlformats-officedocument.wordprocessingml.document表示docx文件,application/msword表示doc文件,具体在这里查:常见 MIME 类型列表

  但是一般情况下想要获取后端传来的二进制流都会在请求头中添加 responseType: 'blob' 设置响应数据为blob格式

 

2、实操

  1)下载插件:npm i axios file-saver

  2)封装一个点击下载的函数:

    getFile(url) {
      axios({
        headers: { Authorization: 'Bearer ' + sessionStorage.getItem('token') },
        method: 'get',
        url,
        responseType: 'blob'
      })
        .then(data => {
          let blob = new Blob([data.data], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' })
          saveAs(blob, '自定义名称.xxx')
        })
        .catch(error => {
          console.warn(error.toString())
        })
    },

    解释:

      1、saveAs() 方法中第一个参数是blob对象,第二个参数是设置文件名和后缀名。变量blob在实例化之前就已经是blob对象了,这里只是对格式进行了重新定义,用原来的data.data也可以进行下载

      2、使用 window.URL.createObjectURL() 将实例化后的blob对象放进来,可以得到一个blob类型的地址(格式:blob:https://192.168.10.51:8080/dbad6f81-13ad-4af9-85d4-3c0bc81e53f6),可以使用 window.open(url) 下载这个文件,但是这种方式不能重命名,不如 saveAs() 方法用的爽

      3、如果在请求的时候没有设置 responseType: 'blob',那么 new Blob() 的作用就提现出来啦

        

 

        BUT!!!还是请加上 responseType: 'blob'

       4、调用 getFile() 传入文件url进行下载

 

posted @ 2020-12-11 15:51  吴小明-  阅读(2168)  评论(0编辑  收藏  举报