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 相关文章推荐
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
Nov 26 Javascript
5秒后跳转到另一个页面的js代码
Oct 12 Javascript
javascript实现按回车键切换焦点
Feb 09 Javascript
JS给超链接加确认对话框的方法
Feb 24 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 Javascript
全面了解javascript三元运算符
Jun 27 Javascript
validationEngine 表单验证插件使用实例代码
Jun 15 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
Jul 03 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
Jul 18 Javascript
使用puppeteer破解极验的滑动验证码
Feb 24 Javascript
深入理解JavaScript和TypeScript中的class
Apr 22 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
Dec 01 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进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
Laravel 5 学习笔记
2015/03/06 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
vue构建单页面应用实战
2017/04/10 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
python实现人人网登录示例分享
2014/01/19 Python
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Tesserocr库的正确安装方式
2018/10/19 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
python树的同构学习笔记
2019/09/14 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
Linux开机引导的步骤是什么
2014/02/26 面试题
毕业自我鉴定范文
2013/11/06 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
56句经典英文座右铭
2019/08/09 职场文书
深入浅析Django MTV模式
2021/09/04 Python
Pygame Time时间控制的具体使用详解
2021/11/17 Python