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进阶教程(第四课第一部分)
Apr 05 Javascript
javascript之bind使用介绍
Oct 09 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
Mar 29 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
Jan 07 Javascript
javascript生成json数据简单示例分享
Feb 14 Javascript
用unescape反编码得出汉字示例
Apr 24 Javascript
详解Bootstrap按钮
Jan 04 Javascript
JavaScript表单验证实例之验证表单项是否为空
Jan 10 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
Apr 19 Javascript
JS实现点星星消除小游戏
Mar 24 Javascript
微信小程序 button样式设置为图片的方法
Jun 19 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在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
php二维数组用键名分组相加实例函数
2013/11/06 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
原创javascript小游戏实现代码
2010/08/19 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
初步理解Python进程的信号通讯
2015/04/09 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
Python 字符串与数字输出方法
2018/07/16 Python
python修改字典键(key)的方法
2019/08/05 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
监理员的岗位职责
2013/11/13 职场文书
教师远程培训感言
2014/03/06 职场文书
医学专业大学生求职信
2014/07/12 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
python 下载文件的几种方式分享
2021/04/07 Python
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技