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 相关文章推荐
屏蔽F1~F12的快捷键的js函数
May 06 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
Apr 27 Javascript
javascript之querySelector和querySelectorAll使用说明
Oct 09 Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
Nov 08 Javascript
在Linux上用forever实现Node.js项目自启动
Jul 09 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
Feb 21 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
Mar 09 Javascript
Vue前端开发规范整理(推荐)
Apr 23 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
Aug 08 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
Nov 01 Javascript
JavaScript 中的六种循环方法
Jan 06 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
PHP4引用文件语句的对比
2006/10/09 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
Python获取服务器信息的最简单实现方法
2015/03/05 Python
Python创建系统目录的方法
2015/03/11 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
详解Django通用视图中的函数包装
2015/07/21 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Python中 map()函数的用法详解
2018/07/10 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
python日期相关操作实例小结
2019/06/24 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
顶撞老师检讨书
2014/02/07 职场文书
加油口号大全
2014/06/13 职场文书
纪委立案决定书
2015/06/24 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书