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 相关文章推荐
事件冒泡是什么如何用jquery阻止事件冒泡
Mar 20 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
javascript中style.left和offsetLeft的用法说明
Mar 07 Javascript
script标签属性用type还是language
Jan 21 Javascript
jquery实现倒计时功能
Dec 28 Javascript
JQuery日期插件datepicker的使用方法
Mar 03 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
Jun 13 Javascript
javascript常用经典算法详解
Jan 11 Javascript
Angularjs中的$apply及优化使用详解
Jul 02 Javascript
vue.js 中使用(...)运算符报错的解决方法
Aug 09 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
Sep 29 Javascript
vue的项目如何打包上线
Apr 13 Vue.js
原生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
杏林同学录(七)
2006/10/09 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
React Router v4 入坑指南(小结)
2018/04/08 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
python中的多线程实例教程
2014/08/27 Python
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Python绘制七段数码管实例代码
2017/12/20 Python
Python3常见函数range()用法详解
2019/12/30 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
is_file和file_exists效率比较
2021/03/14 PHP
优秀毕业生自我鉴定
2014/02/11 职场文书
促销活动总结范文
2014/04/30 职场文书
新店开张活动方案
2014/08/24 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书