JavaScript常用文件下载方法

261 阅读1分钟

注意:如果在项目中引用mokejs,会影响原生ajax的responseType,导致配置blob方式无法生效,无法进行文档流下载

// 方法一  直接打开新标签页,IE会出现兼容问题
window.open('/api/delivery/channel/export?' + paramsString)
// 方法二  调用插件 npm install --save ly-downloader
download(1,'/api/delivery/channel/export?' + paramsString, 'kkk' )
// 方法三  action方法,传参后创建blob对象
this.asyExportchannelexcel().then((res) => {
  // console.log(res)
  // let data = "\ufeff" + res.data
  let blob = new Blob([res.data], {
      type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  })
  if (window.navigator.msSaveOrOpenBlob) {
      navigator.msSaveBlob(blob);
  } else {
      let url = window.URL.createObjectURL(blob)
      let elink = document.createElement('a');
      elink.download = "文件名称.xls";
      elink.style.display = 'none';
      elink.href = url
      document.body.appendChild(elink);
      elink.click();
      document.body.removeChild(elink);
  }
})
// 方法四  创建xhr对象,实现请求
let xhr = new XMLHttpRequest()
let fileName = 'file.xls' // 文件名称 
xhr.open('GET', '/api/delivery/channel/export?' + paramsString, true)
xhr.responseType = 'arraybuffer'
console.log(xhr)
// xhr.setRequestHeader(token, 'xxxxx') // 请求头中的验证信息等(如果有)
xhr.onload = function() {
  if (this.status === 201) {
    let type = xhr.getResponseHeader('Content-Type')
    console.log(type)
    let blob = new Blob([this.response], {type: type})
    if (typeof window.navigator.msSaveBlob !== 'undefined') {
      window.navigator.msSaveBlob(blob, fileName)
    } else {
      let URL = window.URL || window.webkitURL
      let objectUrl = URL.createObjectURL(blob)
      if (fileName) {
        var a = document.createElement('a')
        // safari doesn't support this yet
        if (typeof a.download === 'undefined') {
          window.location = objectUrl
        } else {
          a.href = objectUrl
          a.download = fileName
          document.body.appendChild(a)
          a.click()
          a.remove()
        }
      } else {
        window.location = objectUrl
      }
    }
  }
}
xhr.send()
// 方法五  原生axios实现请求
let info = {
  downloadinfo: 'params'
}
axios({
    method: 'GET',
    url: '/api/delivery/channel/export',
    header: {
        contentType: "application/x-www-form-urlencoded; charset=utf-8"
    },
    params: info,
    responseType: 'blob'
  }).then(res=>{
    console.log(res)
    let blob = new Blob([res.data], {type: "application/vnd.ms-excel;charset=utf-8"});
    console.log(blob)
    let fileName = '文件名称.xls'
    if (window.navigator.msSaveOrOpenBlob) { // IE10
      navigator.msSaveBlob(blob, fileName);
    } else {
      let link = document.createElement('a');
      link.style.display = 'none';
      link.href = URL.createObjectURL(blob); //创建一个指向该参数对象的URL
      link.download = fileName;
      link.click(); // 触发下载
      URL.revokeObjectURL(link.href); // 释放通过 URL.createObjectURL() 创建的 URL
    }
  }).catch(err=>{
    console.log(err)
  })
}