当前位置:首页 » 《关于电脑》 » 正文

前端实现获取后端返回的文件流并下载

27 人参与  2024年11月14日 19:21  分类 : 《关于电脑》  评论

点击全文阅读


前端实现获取后端返回的文件流并下载

方法一:使用Axios实现文件流下载优点缺点 方法二:使用封装的Request工具实现文件流下载优点缺点 方法三:直接通过URL跳转下载优点缺点 结论

在前端开发中,有时需要从后端获取文件流,并将其下载到本地。本文介绍如何在前端实现此功能的不同的实现方法,并分析其优缺点

方法一:使用Axios实现文件流下载

使用Axios实现文件流下载的方法,本人亲测可以实现

import axios from 'axios';import { getToken } from '@/utils/auth'handleExport() {  // 接口调用获取文件  axios({    method: 'get',    responseType: 'blob', // 指定响应类型为blob    url: this.GLOBAL.baseURL + '/api/v1/business/user/export',    data: this.queryParams, // 导入文件一般都用FormData格式数据    headers: { 'Authorization': 'Bearer ' + getToken() } // 传递token进行身份验证  }).then(res => {    if (res.code === 200) {      // 导入成功      this.downloadBinaryFile(res.data, '导入失败后下载的报错文件')    } else {      // 输出失败信息    }  }).catch(error => {    console.error('下载失败', error);  });},    /** * 将二进制文件下载到本地,保存为excel文件 * @param {*} binFile 二进制文件流 * @param {*} fileName 下载后的文件名 * @param {*} blobType 文件格式,默认为 "application/vnd.ms-excel" */downloadBinaryFile(binFile, fileName, blobType = "application/vnd.ms-excel") {  // 创建 Blob 对象,包含二进制文件流和文件类型  const blobObj = new Blob([binFile], { type: blobType });    // 创建下载链接元素  const downloadLink = document.createElement('a');    // 处理不同浏览器的 URL 兼容性  let url = window.URL || window.webkitURL;   url = url.createObjectURL(blobObj); // 创建文件 URL    // 设置下载链接属性  downloadLink.href = url;  downloadLink.download = fileName;    // 将下载链接添加到文档中并触发点击事件  document.body.appendChild(downloadLink);  downloadLink.click();    // 移除下载链接并释放 URL 对象  document.body.removeChild(downloadLink);  window.URL.revokeObjectURL(url);}

实现的效果

image-20240613095753872

优点

支持传递Token进行身份验证,安全性较高支持POST请求,可以将参数放在请求体中,避免URL长度限制及参数暴露

缺点

实现相对复杂,需要手动创建和管理Blob对象及下载链接

方法二:使用封装的Request工具实现文件流下载

接下来介绍使用封装的Request工具实现文件流下载的方法

import request from '@/utils/request'// 日志管理收藏、浏览、下载导出接口export function exportUserOperateAdmin(data, headers) {  return request({    url: '/business/user/export',    method: 'get',    data: data,    headers: headers  })}// 调用导出接口exportUserOperateAdmin(this.queryParams, { responseType: 'blob' }).then(  response => {    console.log(response)    const url = window.URL.createObjectURL(new Blob([response.data])) // 创建下载链接    const link = document.createElement('a')    link.href = url    link.download = '全文导入模板.xlsx' // 设置文件名    document.body.appendChild(link)    link.click() // 触发下载    document.body.removeChild(link) // 下载后移除元素  }).catch(error => {  console.error('下载失败', error)  this.loading = false // 停止加载,隐藏加载状态})

优点

封装后的Request工具调用简单,代码更简洁支持传递Token进行身份验证,安全性较高

缺点

实现相对简单,但仍需手动处理Blob对象及下载链接

方法三:直接通过URL跳转下载

最后介绍直接通过URL跳转实现文件下载的方法

const baseurl = this.GLOBAL.baseURL// 拼接上导出的地址,如果接口还需要其他参数,都可以直接拼接上let url = baseurl + '/api/v1/business/user/export';console.log(url)alert(url)// 第二个参数'_self'表示在当前页下载,不打开新的页面window.open(url, '_self')

优点

实现简单,不需要处理Blob对象及下载链接适合下载无需身份验证或参数简单的文件

缺点

无法传递Token进行身份验证,安全性较低参数放在URL中不安全,且可能会导致URL过长处理中文参数可能会出现乱码问题

结论

以上三种方法各有优缺点,实际开发中可以根据具体需求选择合适的方法。

如果需要传递Token进行身份验证并确保下载安全性,推荐使用方法一或方法二

如果只是简单下载无需验证的文件,可以考虑使用方法三


点击全文阅读


本文链接:http://zhangshiyu.com/post/186224.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1