javascript使用Blob对象实现的下载文件操作示例


Posted in Javascript onApril 18, 2020

本文实例讲述了javascript使用Blob对象实现的下载文件操作。分享给大家供大家参考,具体如下:

Blob对象

  • 前言
  • 环境
  • 操作
  • 总结

Blob是一个类文件的不可变的原始数据对象,非javascript原生数据类型,File对象就是继承自Blob对象,且在Blob的基础上进行扩展,以便支持用户系统上的文件。

前言

最近在做以post请求方式导出excel时,想到了可以使用Blob对象将后台返回的输出流以arraybuffer或blob的格式接收交给Blob处理,最后使用URL生成链接,供浏览器下载excel。

环境

  1. vue2.x
  2. webpack3.x
  3. axios

操作

import axios from 'axios'
/**
* 从服务器下载excel
*/
function downloadExcel (settings) {
 const defaultOptions = {
  responseType: 'arraybuffer'
 }
 Object.assign(settings.options, defaultOptions)
 requestToResponse(settings).then(res => {
  const filename = decodeURI(res.headers['content-disposition'].split('filename=')[1])
  if ('download' in document.createElement('a')) {
   downloadFile(res.data, filename)
  } else {
   Message.error('浏览器不支持')
  }
 })
}
/**
* 发送http请求
* @param {Object} settings api参数
* @returns reponse
*/
function requestToResponse (settings) {
  const defaultParams = {
  timeout: 45000,
  headers: {
   'X-Requested-With': 'XMLHttpRequest',
   'Content-Type': 'application/json'
  },
  responseType: 'json',
  method: 'POST'
 }
 Object.assign(defaultParams, settings)
  return new Promise((resolve, reject) => {
  axios(defaultParams).then(res => {
   resolve(res)
  }).catch(err => {
   reject(err)
  })
 })
}
/**
* blob下载(兼容IE)
* @param {String} content 文件内容
* @param {String} filename 文件名
*/
function downloadFile (content, filename) {
 const blob = new Blob([content])
 // IE
 if (window.navigator && window.navigator.msSaveOrOpenBlob) {
  window.navigator.msSaveOrOpenBlob(blob, filename)
 } else {
  imatateDownloadByA(window.URL.createObjectURL(blob), filename)
 }
}
/**
* 通过a标签模拟下载
* @param {String} href
* @param {String} filename
*/
function imatateDownloadByA (href, filename) {
 const a = document.createElement('a')
 a.download = filename
 a.style.display = 'none'
 a.href = href
 document.body.appendChild(a)
 a.click()
 a.remove()
 window.URL.revokeObjectURL(href)
}

// 下载excel
downloadExcel({
  url: '/default/excel/export',
  responseType: 'arraybuffer'
})

responseType设置为arraybuffer
javascript使用Blob对象实现的下载文件操作示例
responseTyp设置成blob
javascript使用Blob对象实现的下载文件操作示例
不设置responseType,出现乱码
javascript使用Blob对象实现的下载文件操作示例
若引入mockjs,其拦截响应,重置了responseType,会出现乱码
javascript使用Blob对象实现的下载文件操作示例

总结

  1. 此下载excel只适用于post请求,get请求交给浏览器自行解析处理
  2. responseType必须设置成arraybuffer或blob
  3. 下载excel时务必关闭mockjs之类的拦截响应的服务

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
ExtJS 2.0实用简明教程之应用ExtJS
Apr 29 Javascript
JQuery datepicker 使用方法
May 20 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
javascript实现回车键提交表单方法总结
Jan 10 Javascript
JS动态加载当前时间的方法
Feb 09 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
Mar 18 Javascript
COM组件中调用JavaScript函数详解及实例
Feb 23 Javascript
Angular开发者指南之入门介绍
Mar 05 Javascript
微信小程序五星评分效果实现代码
Apr 06 Javascript
微信小程序动态的加载数据实例代码
Apr 14 Javascript
vue中使用mxgraph的方法实例代码详解
May 17 Javascript
es6函数之箭头函数用法实例详解
Apr 25 Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 #Javascript
es6函数name属性功能与用法实例分析
Apr 18 #Javascript
es6数组includes()用法实例分析
Apr 18 #Javascript
es6数组的flat(),flatMap()函数用法实例分析
Apr 18 #Javascript
es6函数中的作用域实例分析
Apr 18 #Javascript
es6函数之rest参数用法实例分析
Apr 18 #Javascript
vue实现短信验证码输入框
Apr 17 #Javascript
You might like
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
完美的php分页类
2017/10/24 PHP
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
jQuery的text()方法用法分析
2014/12/20 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
python实现简单的TCP代理服务器
2014/10/08 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
大专自我鉴定范文
2013/10/01 职场文书
食堂个人先进事迹
2014/01/22 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript
python实现A*寻路算法
2021/06/13 Python
基于Python实现股票收益率分析
2022/04/02 Python