vue 后端返回二进制流文件,前端如何实现下载?

目录

1. axios 请求二进制流文件导出文件

1.1 后台返回的二进制流: 

1.2 使用:

1.3 需要注意以下几点:

2. 关于 arraybuffer 和 blob

2.1 ArrayBuffer 和 blob

2.2 区别

2.3 相互转换

3. 主要参考: 


1. axios 请求二进制流文件导出文件

  下载的时候需要传请求头时,普通的 window.location.href=url、window.open(url) 就不适用了。通过 axios 设置服务器响应的数据类型,可以下载后台返回的二进制流文件。

`responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'

1.1 后台返回的二进制流: 

因为我这里用到的比较多,所在封装在的公共函数中:

const exportExcel = function(url, params={}){axios.get(url,{ params:params, responseType: 'arraybuffer'}).then(function(res){console.log("返回的二进制流文件", res )if(!res) return;//fileName:下载的文件名var fileName = decodeURIComponent(res.headers["content-disposition"].split("=")[1])let blob = new Blob([res.data], {type: 'application/vnd.ms-excel;charset=utf-8'});// 针对ie浏览器if (window.navigator && window.navigator.msSaveOrOpenBlob) {window.navigator.msSaveOrOpenBlob(blob, fileName);} else {//非ie浏览器var downloadElement = document.createElement("a");var 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);  //释放blob对象}}).catch(function(error){console.log(error);})
}export default {exportExcel}

1.2 使用:

<el-button type="primary" plain size="mini" icon="el-icon-download" @click="exportFile">导出</el-button>methods:{//导出exportFile(){exportExcel("/api/warehouse/exportDetailsWarehouse", this.searchForm); //本地测试}
}

1.3 需要注意以下几点:

  1. res 的返回值,很多人封装 axios 时直接返回了res.data,上面代码中的 res.data 改为 res 就好了。
    let blob = new Blob([res], {type: 'application/vnd.ms-excel;charset=utf-8'});
    但是如果后台在接口里面返回了文件名,是获取不到的,因为只能获取到 res.data 的内容。
  2. 本地调试时,做好跨域代理,否则会报跨域问题。
  3. post 请求可能会失败。

    以上是我在做这个需求时碰到的问题,有的人可能在项目中安装了 mockjs,导致下载失败,参考:

vue axios(下载文件流)设置返回值类型responseType:'blob'无效的问题_kk无敌怕的博客-CSDN博客_axios设置responsetype


2. 关于 arraybuffer 和 blob

    在参考博客时,发现对于 responseType 有的是填“blob”,有的是 “arraybuffer”,因此去了解了一下这两个的区别。

2.1 ArrayBuffer 和 blob

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。
它是一个字节数组,通常在其他语言中称为“byte array”。
你不能直接操作 ArrayBuffer 的内容,而是要通过类型数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。
Blob 表示的不一定是JavaScript原生格式的数据。File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
要从其他非blob对象和数据构造一个 Blob,使用 Blob() 构造函数。要创建一个 blob 数据的子集 blob,使用 slice() 方法。

2.2 区别

ArrayBuffer对象用来表示通用的、固定长度的原始二进制数据缓冲区。
Blob (binary large object),他表示一个不可变、原始数据的类文件对象,
blob类型只有slice方法,用于返回一个新的 Blob对象,包含了源 Blob对象中指定范围内的数据。
对比发现,ArrayBuffer的数据,是可以按照字节去操作的,而Blob的只能作为一个整的对象去处理。
所以说,ArrayBuffer相比Blob更接近真实的二进制,更底层。

    ArrayBuffer 和 Blob一样,都是二进制数据的容器,而ArrayBuffer相比更为底层,他可以去操作去修改这些二进制值,这两者之间也是可以互转的。

2.3 相互转换

// arraybuffer转blob很方便,作为参数传入就行了。
var buffer = new ArrayBuffer(16)
var blob = new Blob([buffer])
//此处需要借助fileReader对象:
var blob = new Blob([1,2,3,4,5])
var reader = new FileReader()
reader.onload = function() {console.log(this.result)
}
reader.readAsArrayBuffer(blob)
// 控制台输出的则是ArrayBuffer的数据了

        我这里用的 arraybuffer,改为 “blob” 也能正常下载。

arraybuffer
responseType: arraybuffer 请求到的数据
responseTyle:blob 请求到的数据

3. 主要参考: 

前端通过axios请求下载excel文件_qq_31645371的博客-CSDN博客_axios post下载excel当后台接口有token校验的时候,通过window.location.href=url,不能携带token参数,因而此方法不能正常下载excel文件但是通过axios请求可以实现请求头中携带token参数,具体代码如下:...https://blog.csdn.net/qq_31645371/article/details/91984217后端返回二进制文件流,前端处理下载 - eightabs - 博客园处理逻辑:获取返回文件流,通过 Blob 对象构造文件后下载。 function download(data, filename, type="application/vnd.ms-excehttps://www.cnblogs.com/eightabs/p/14079581.html

axios 请求接口获取文件流数据导出数据到excel,解决乱码 - 久而久之灬 - 博客园axios.get("URL",{ params:{ data1:data1, data2:data2 }, headers: { 'Content-Type':https://www.cnblogs.com/yaomin/p/10821065.html

window.URL.createObjectURL Blob URL在IE中兼容问题_Yang Yong 的博客-CSDN博客问题描述window.URL.createObjectURL()可以直接生成blob:开头的链接,该链接产生于浏览器端,不会占用服务器资源。window.URL.createObjectURL()在IE10, IE11以及Microsoft Edge中生成的blob:链接,你不能把它加到一个&lt;a&gt;节点上,也不能直接在浏览器地址栏打开访问,并且得到“Error: 拒绝访问。...https://blog.csdn.net/u014628388/article/details/81738704


前端 ArrayBuffer 与 Blob 互转_前端挖掘机-CSDN博客_blob转arraybuffer首先说一点基础知识:responseType 可选的参数有:"text"、"arraybuffer"、"blob" 或 "document";对应的返回数据为 DOMString、ArrayBuffer、Blob、Document;默认参数为"text"。前端请求二进制数据的时候需要设置数据响应格式:xhr.responseType = "arraybuffer";写法如下:...https://blog.csdn.net/weixin_41849462/article/details/103409341 前端实现调用后台接口下载,arraybuffer和blob - 简书下载 封装调用接口方法 下载函数 注:window.URL.createObjectURL URL.createObjectURL() 静态方法会创建一个 DOMString...https://www.jianshu.com/p/de8b3b76f131

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间

python量化之路&#xff1a;获取历史某一时刻沪深上市公司股票代码及上市时间 最近开始玩股票量化&#xff0c;由于想要做完整的股票回测&#xff0c;因此股票的上市和退市信息就必不可少。因为我们回测的时候必须要知道某一日期沪深股票的成分包含哪些对吧。所以我们要把沪深全…

《网页设计创意书》读后感

刚刚收到《网页设计创意书》&#xff0c;确实有点惊喜&#xff0c;开始以为是像之前审读的书一样是一叠叠的打印纸&#xff0c;没想到是一本成品书&#xff0c;拿到手上沉甸甸的&#xff0c;随便翻看了一下&#xff0c;没想到里面竟然还是全彩页印刷的&#xff0c;本书的第一感…

游戏AI –行为树简介

游戏AI是一个非常广泛的主题&#xff0c;尽管有很多资料&#xff0c;但我找不到能以较慢&#xff0c;更容易理解的速度缓慢介绍这些概念的东西。 本文将尝试解释如何基于行为树的概念来设计一个非常简单但可扩展的AI系统。 什么是AI&#xff1f; 人工智能是参与游戏的实体表现…

js 常用类型转换简写

1、字符串转数字 666// 666 2、转换为字符串 666//666 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

mockJs文档(二)

mockJs官方文档 mockJs文档&#xff08;一&#xff09; 目录 1. Mock.mock( rurl?, rtype?, template|function( options ) ) 1.1 Mock.mock( template ) 1.2 Mock.mock( rurl, template ) 1.3 Mock.mock( rurl, function( options ) ) 1.4 Mock.mock( rurl, r…

winforms中限定上传文件类型

获取文件路径string fileExtension System.IO.Path.GetExtension(filePath).ToLower();bool flag true;string[] AllowExtension { ".doc", ".xls", ".ppt", ".docx", ".xlsx", ".pptx", ".txt", &q…

liteos错误处理(十一)

1. 概述 1.1 基本概念 错误处理指用户代码发生错误时&#xff0c;系统调用错误处理模块的接口函数&#xff0c;完成上报错误信息&#xff0c;并调用用户自己的钩子函数&#xff0c;进行特定的处理。 错误处理模块实现OS内部错误码记录功能。OS内部错误码无法通过接口返回&#…

这是东西:jUnit:动态测试生成

当您需要在许多不同的输入值或配置上运行同一组测试时&#xff0c;动态测试生成很有用。 可以使用参数化测试或使用理论来实现。 当您有大量数据用作参数并想对所有组合进行测试时&#xff0c;这些理论非常有用。 您得到的控制较少&#xff0c;但是您不必自己编写合并和迭代的…

js 变量提升与函数提升

规则&#xff1a; 函数的提升优先于变量提升。同名的函数会覆盖同名的函数与变量。同名的变量不会覆盖同名的函数。 示例代码1&#xff1a; <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"vi…

mockJs文档(一)

Mock.js 官网 目录 1. 开始安装 1.1 Node&#xff08;CommonJS&#xff09; 1.2 CMD方式 2. 语法规范 2.1 数据模板定义规范 DTD 2.1.1. 属性值是字符串 String 2.1.2. 属性值是数字 Number 2.1.3. 属性值是布尔型 Boolean 2.1.4. 属性值是对象 Object 2.1.5. 属性值…

【JOURNAL】《不思八九》 --和友腊八诗一首

不思八九旧岁新醅雪&#xff0c;腊八数九粥。红泥杜康曲&#xff0c;暖腹亦无忧。&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;http://t.sina.com.cn/n/博客顺风 腊八 辞岁逢新雪&#xff0c;好煮腊八粥。且将情入味&#xff0c;一并…

团队测试计划

我们是否需要测试&#xff0c;直到我们的软件是完美的&#xff1f; 首先针对第一个问题&#xff0c;我们一直觉得有必要&#xff0c;因为老师说过&#xff0c;只有多次测试才能真正检测出自己的代码是否完全没问题&#xff0c;所以我们进行了多次测试&#xff0c;虽然我对自己的…

ChoiceFormat:数字范围格式

ChoiceFormat类的Javadoc声明ChoiceFormat “允许您将格式附加到一定范围的数字上”&#xff0c;并且“通常在MessageFormat中用于处理复数”。 这篇文章描述了java.text.ChoiceFormat并提供了一些在Java代码中应用它的示例。 ChoiceFormat与java.text包中其他“ 格式 ”类之间…

vue sync用法

1、父组件 <add-rule :show.sync"showEditDialog" :addOrUpdate"addOrUpdate" close"showEditDialog false" :ruleData"editIfo" /> 2、子组件 // 这样可以// this.$emit(close)// 这样也可以this.$emit(update:show, false);…

小程序 获取手机号

【参考小程序开发文档&#xff1a;开发-指南-开放能力-用户信息-获取手机号】 地理位置 wx.getLocation(Object object) | 微信开放文档 手机号 获取手机号 | 微信开放文档 微信信息 小程序与小游戏获取用户信息接口调整&#xff0c;请开发者注意升级。 | 微信开放社区 目录…

Java 生成 32位 UUID

UUID&#xff1a;Universally Unique Identifier 通用唯一识别码 现在很多数据库的主键id&#xff0c;由原来的int自增&#xff0c;改为 UUID 表示。因为 UUID 本身不可能重复&#xff0c;线程安全&#xff0c;完美支持高并发。 示例代码如下&#xff1a; package com.miracle.…

使用Infinispan作为持久性解决方案

从https://vaadin.com/blog/-/blogs/using-infinispan-as-a-persistency-solution交叉发布。 感谢Fredrik和Matti的允许&#xff01; 各种RDBMS是持久性的实际标准。 建筑师认为使用它们是一个安全的选择&#xff0c;我敢说现在它们在很多地方都使用过。 为了解决这个问题&…

CSS布局之脱离文档流详解——浮动、绝对定位脱离文档流的区别

1、代码 &#xff08;1&#xff09;示例代码1 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-e…

小程序 获取当前城市位置-高德地图

微信小程序 wx.getLocation 只能获取到经纬度&#xff0c;想要获取具体城市信息&#xff0c;需要使用地图插件。公司要求使用 高德地图&#xff0c;在使用上&#xff0c;几个地图的代码步骤都差不多。 目录 1. 查看官方文档 1.1 申请高德地图Key&#xff0c;点击查看申请key…

会议之于思考

从开始学习英语,我们几乎每天都要开会,讨论问题,确切的说是我们提出疑问,老师在给我们解答.这样高密集的开会,在提高班还是很少见到的 因为老师一个人带了很多学生,还有其他的工作要做.平时可是享受不到这样的待遇的.(其实我们的开会就是上课) 开的会多了,我就想到一个问题.为什…