用文件流blob下载Excel文件

503 阅读1分钟

普通文件流转换

async downloadFile(src, filename) {
  this.getBlob(src).then(blob => {
    this.saveAs(blob, filename)
  })
},
getBlob(url, cb) {
  return new Promise(resolve => {
    const xhr = new XMLHttpRequest()
    xhr.open('GET', url, true)
    xhr.responseType = 'blob'
    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(xhr.response)
      }
    }
    xhr.send()
  })
},
saveAs(blob, filename) {
  if (window.navigator.msSaveOrOpenBlob) {
    navigator.msSaveBlob(blob, filename)
  } else {
    const link = document.createElement('a')
    const body = document.querySelector('body')
    link.href = window.URL.createObjectURL(blob)
    link.download = filename
    // fix Firefox
    link.style.display = 'none'
    body.appendChild(link)
    link.click()
    body.removeChild(link)
    window.URL.revokeObjectURL(link.href)
  }
}

this.downloadFile('srcxxxxxxxx',filename)

base64转换blob再下载

b64toFile(b64Data, filename, contentType) {
  let sliceSize = 512
  let byteCharacters = atob(b64Data)
  let byteArrays = []

  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    let slice = byteCharacters.slice(offset, offset + sliceSize)
    let byteNumbers = new Array(slice.length)

    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i)
    }
    let byteArray = new Uint8Array(byteNumbers)
    byteArrays.push(byteArray)
  }

  let file = new File(byteArrays, filename, { type: contentType })
  return file
}


let file = this.b64toFile(base46, filename , contentType)
this.saveAs(file, filename)