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

转载自,原文格式更清晰:vue 后端返回二进制流文件,前端如何实现下载?_vue 返回文件流如何下载_Start2019的博客-CSDN博客


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

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

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

1.1 后台返回的二进制流: 

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

  1. const exportExcel = function(url, params={}){

  2. axios.get(url,{ params:params, responseType: 'arraybuffer'}).then(function(res){

  3. console.log("返回的二进制流文件", res )

  4. if(!res) return;

  5. //fileName:下载的文件名

  6. var fileName = decodeURIComponent(res.headers["content-disposition"].split("=")[1])

  7. let blob = new Blob([res.data], {type: 'application/vnd.ms-excel;charset=utf-8'});

  8. // 针对ie浏览器

  9. if (window.navigator && window.navigator.msSaveOrOpenBlob) {

  10. window.navigator.msSaveOrOpenBlob(blob, fileName);

  11. } else {

  12. //非ie浏览器

  13. var downloadElement = document.createElement("a");

  14. var href = window.URL.createObjectURL(blob); //常见下载的链接

  15. downloadElement.href = href;

  16. downloadElement.download = fileName; //下载后文件名

  17. document.body.appendChild(downloadElement);

  18. downloadElement.click(); //点击下载

  19. document.body.removeChild(downloadElement); //下载完成移除元素

  20. window.URL.revokeObjectURL(href); //释放blob对象

  21. }

  22. }).catch(function(error){

  23. console.log(error);

  24. })

  25. }

  26. export default {exportExcel}

1.2 使用:

 
  1. <el-button type="primary" plain size="mini" icon="el-icon-download" @click="exportFile">导出</el-button>

  2. methods:{

  3. //导出

  4. exportFile(){

  5. exportExcel("/api/warehouse/exportDetailsWarehouse", this.searchForm); //本地测试

  6. }

  7. }

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 相互转换

 
  1. // arraybuffer转blob很方便,作为参数传入就行了。

  2. var buffer = new ArrayBuffer(16)

  3. var blob = new Blob([buffer])

 
  1. //此处需要借助fileReader对象:

  2. var blob = new Blob([1,2,3,4,5])

  3. var reader = new FileReader()

  4. reader.onload = function() {

  5. console.log(this.result)

  6. }

  7. reader.readAsArrayBuffer(blob)

  8. // 控制台输出的则是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-exce​编辑https://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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后端可以返回二进制文件前端前端使用Vue框架可以实现在线预览这些文件。 首先,后端需要将文件二进制的形式返回前端。可以使用一些常见的后端语言和框架,如Java的Spring Boot、Python的Django等。在后端,可以通过读取文件的字节数据,再将字节数据以的形式返回前端。 在前端,使用Vue框架可以方便地处理二进制文件实现在线预览。首先,前端需要获取到后端返回文件,在Vue的组件中通过调用后端的API接口获取文件二进制数据。 获取到二进制数据后,可以使用FileReader对象将文件转换成可读的文件对象。通过FileReader的readAsDataURL方法,可以将二进制数据转换成DataURL格式,这个格式可以直接在HTML的img标签中使用。 在Vue的模板中,可以使用<img>标签来展示转换后的DataURL格式的文件数据。设置这个标签的src属性为转换后的DataURL数据,就可以在页面上实时预览文件了。 需要注意的是,不同类型的文件可能需要使用不同的处理方式。例如,图片文件可以直接在<img>标签中展示,而音频文件和视频文件可能需要使用特定的播放器插件。根据不同的文件类型,选择合适的方式来实现在线预览。 总结来说,后端返回二进制文件前端Vue框架可以通过调用后端API接口获取文件数据,并通过FileReader将二进制数据转换成可读的文件对象,使用<img>标签或其他特定的插件进行在线预览。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值