技术

浏览器中文件下载

blob文件下载相关

浏览器中文件下载

function downloadFileWithToken (fileUrl, fileName) {
  if (!fileName) fileName = fileUrl.replace(/.+\/([^\/]+$)/, '$1')
  return axios({
    method: 'get',
    url: fileUrl,
    headers: {
      'xxxx': localStorage.getItem('token')
    },
    responseType: 'blob' // 希望后端返回Blob类型属性
  }).then(res => {
    const blob = new Blob([res.data], {
        // 创建一个新的Blob对象来接收后端的文件,这里第一个参数必须是数组类型,否则下载必出错。
        type: 'application/octet-stream'
        // type,表明该 Blob 对象所包含数据的 MIME 类型,这需要前后端统一规划
    })
    let link = document.createElement('a')    let body = document.querySelector('body')
    link.href = window.URL.createObjectURL(blob) // 创建一个下载文件的URL,它指向blob,因为Blob对象在之前在接收后端发来的文件流信息。因为是Blob对象,所以不会跳转页面
    link.download = fileName || 'download' // 自己制定下载文件的文件名
    // 兼容火狐浏览器
    link.style.display = 'none' // 让这个a标签不可见
    body.appendChild(link)
    link.click()    // 创建了新的a标签之后模拟点击事件,开始传输文件
    body.removeChild(link)  // 下载完成之后,移除按钮,垃圾回收,减少页面内存消耗
    window.URL.revokeObjectURL(link.href) // 移除之前使用createObjectURL创建的URL,垃圾回收
  })
}

参考链接: https://blog.csdn.net/Raymend_Lee/article/details/135568073

用blob url可以自定义下载文件的文件名 由于是blob对象,所以上面的下载方法不会打开空白页进行下载,如果希望打开一个空白页,再进行下载,可以将link.target设置成_blank。这样会打开一个空白页,然后再进行下载 如果不需要自定义文件名,可以参考链接内下载的方法 比如直接将url传给window.location.href,浏览器会直接重定向到这个url的地址,进行下载 File 接口基于 Blob,继承了 blob 的功能并将其扩展以支持用户系统上的文件。