跨域情况下,vue如何下载后台接口提供的application/octet-stream文件流Excel文件

前言

由于跨域,所以无法直接通过window.location.href或者a标签直接下载,直接拼后台接口地址又暴露了后台地址,不可行。

所以在这种跨域情况下,本章讲一下vue如何下载后台接口提供的application/octet-stream文件流Excel文件。

功能

实现前端vue下载后台返回的application/octet-stream文件流

1、使用blob类型请求

2、获取到数据后处理成Blob数据

3、通过创建一个a标签,将Blob数据转换成base64数据,放到a标签的url中

4、触发a标签点击事件实现下载Blob数据

5、删除a标签

代码实现

javascript 复制代码
/**
 * 导出excel
 * @param fileName
 * @returns {AxiosPromise}
 */
export function exportExcel(fileName){
  request({
    url: '/xxx/getCameraXls?fileName='+fileName,
    method: 'get',
    responseType:'blob'
  }).then(res=>{
    const date = new Date(+new Date() + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '').replace(/\-/g, '').replace(/\:/g, '').replace(/\s*/g, '')
    const downloadName = fileName +'-'+ date + '.xlsx'
    downloadFunc(downloadName,res)
  })
}

function downloadFunc(fileName,data){
  const blob = new Blob([data], { type: `'application/vnd.ms-excel';charset=utf-8` })
  const downloadElement = document.createElement('a')
  const href = window.URL.createObjectURL(blob)
  downloadElement.href = href
  downloadElement.download = fileName
  document.body.appendChild(downloadElement)
  downloadElement.click()
  document.body.removeChild(downloadElement)
  window.URL.revokeObjectURL(href)
}
相关推荐
じòぴé南冸じょうげん10 分钟前
小程序的project.private.config.json是无依赖文件,那可以删除吗?
前端·小程序·json
会豪19 分钟前
Electron主进程渲染进程如何优雅的进行通信
前端
jianghaha201120 分钟前
前端 Word 模板参入特定数据 并且下载
前端·word
跟橙姐学代码20 分钟前
轻松搞定 Python 模块与包导入:新手也能秒懂的入门指南
前端·python·ipython
aiwery26 分钟前
大模型场景下的推送技术选型:轮询 vs WebSocket vs SSE
前端·agent
会豪27 分钟前
前端插件-不固定高度的DIV如何增加transition
前端
却尘27 分钟前
Server Actions 深度剖析(2):缓存管理与重新验证,如何用一行代码干掉整个客户端状态层
前端·客户端·next.js
小菜全27 分钟前
Vue 3 + TypeScript 事件触发与数据绑定方法
前端·javascript·vue.js
Hilaku31 分钟前
面试官开始问我AI了,前端的危机真的来了吗?
前端·javascript·面试
懵逼的小黑子1 小时前
excel里面店铺这一列的数据结构是2C【uniteasone17】这种,我想只保留前面的2C部分,后面的【uniteasone17】不要
excel