前端下载文件的方式

459 阅读1分钟
    1. 如果后台提供一个 URL,则用 window.open(URL) 下载
    1. 如果后台直接返回文件的二进制内容,需要前端转化一下再下载

实现方法1:Blob、ajax(axios)

Blob,Binary Large Object的缩写,代表二进制类型的大对象。 在Web中,Blob类型的对象表示不可变的类似文件对象的原始数据,通俗点说,就是Blob对象是二进制数据,但它是类似文件对象的二进制数据,因此可以像操作File对象一样操作Blob对象,实际上,File继承自Blob。

// 列表导出功能,前端向后端发送请求,返回二进制流文件
// 前端下载二进制xlsx 文件
axios({
  method: 'post',
  url: '/export',
  responseType: 'arraybuffer'
  // responseType 表示服务器响应的数据类型
  // 二进制数据,要把它设为 arraybuffer
})
.then(res => {
  // 假设 data 是返回来的二进制数据
  const data = res.data
  // 固定写法
  const url = window.URL.createObjectURL(
      new Blob([data],
      {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}
      )
 )
 // 创建a标签并触发click事件
  const link = document.createElement('a')
  link.style.display = 'none'
  link.href = url
  link.setAttribute('download', 'excel.xlsx') // 文件名、文件类型
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
})

实现方法2:模拟form表单提交

// 注意:如后端需要token验证,则发送请求时要在header中携带token

var params = this.searchForm  // searchForm为请求所需的参数对象
var form = document.createElement('form')
form.action = `请求地址`
form.method = 'get'
// 遍历参数对象,模拟form表单提交
for (const paramsKey in params) {
    var formItemDom = document.createElement('input')
    formItemDom.type = 'hidden'
    formItemDom.name = paramsKey
    formItemDom.value = params.paramsKey
    form.appendChild(formItemDom)
}
document.body.appendChild(form)
form.submit()
document.body.removeChild(form)

参考链接

juejin.cn/post/684490… segmentfault.com/a/119000001…