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 相关文章推荐
JavaScript 高效运行代码分析
Mar 18 Javascript
去掉gridPanel表头全选框的小例子
Jul 18 Javascript
JavaScript使用Range调色及透明度实例
Sep 25 Javascript
Bootstrap基本组件学习笔记之列表组(11)
Dec 07 Javascript
原生javascript实现读写CSS样式的方法详解
Feb 20 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
Apr 24 Javascript
vue嵌套路由与404重定向实现方法分析
May 04 Javascript
vue2过滤器模糊查询方法
Sep 16 Javascript
javascript读取本地文件和目录方法详解
Aug 06 Javascript
利用js canvas实现五子棋游戏
Oct 11 Javascript
webpack4从0搭建组件库的实现
Nov 29 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
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Python中的True,False条件判断实例分析
2015/01/12 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
土木工程师职业规划范文
2014/03/07 职场文书
指导教师评语
2014/04/26 职场文书
期中考试反思800字
2014/05/01 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
学校读书活动总结
2014/06/30 职场文书
后备干部推荐材料
2014/12/24 职场文书
python如何在word中存储本地图片
2021/04/07 Python
Python爬虫实战之爬取携程评论
2021/06/02 Python
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS