前言

阅读项目源码发现下载都使用FileSaver.js插件,所以就打算看看该插件内部的实现,这是初衷。

具体内容

FileSaver.js中的具体实现逻辑如下:

从上面逻辑图中可以看出,FileSaver.js不支持IE10以下的文件下载
上面是主要的流程所列,实际上具体的实现,主要可以分为两点来讲:

  • 支持a标签的download属性的浏览器
  • 不支持download属性的浏览器

支持download的
FileSaver.js对于支持download属性的浏览器,就是使用a标签来实现下载的,核心的实现逻辑大概如下:

function saveAs(blob, name) {var save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a");var can_use_save_link = "download" in save_link;if (can_use_save_link) {var object_url = URL.createObjectURL(blob);a.href = object_url;a.download = name;// 处理暴露的事件dispatch_all();// 释放object Urlrevoke(object_url);}
}

实际上就是创建a标签,主动触发click()事件,这里用到了URL.createObjectURL()创建对象URL。

不支持download的
对于不支持download属性的浏览器,在源码中处理实际上是分为两类:

  • Safari和ios 下chrome,如果支持FileReader

  • 其他

实际上对于不支持download的浏览器的处理就是三种形式下载功能的实现:

  • 如果是特殊浏览器并且支持FileReader, 则使用FileReader来异步读取文件内容,读取完毕后,使用window.open来实现下载,如果不支持window.open来下载,则使用location.href替换URL来实现下载

  • 其他情况下,都是使用URL.createObjectURL来构建对象URL,使用window.open 或location.href替换URL来实现下载

总结

FileSaver.js中实现下载的形式分为大概3种形式:

  • 可以使用a标签的download来实现的

  • 特殊浏览器支持FileReader的,使用其构建URL,使用window.open或location.href来实现

  • 除了特殊的浏览器,使用URL.createObjectURL来构建对象URL,使用window.open或location.href来实现

具体的注释都上传到我的GitHub上,感兴趣可以view下。

FileSaver源码阅读相关推荐

  1. 应用监控CAT之cat-client源码阅读(一)

    CAT 由大众点评开发的,基于 Java 的实时应用监控平台,包括实时应用监控,业务监控.对于及时发现线上问题非常有用.(不知道大家有没有在用) 应用自然是最初级的,用完之后,还想了解下其背后的原理, ...

  2. centos下将vim配置为强大的源码阅读器

    每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译.出现问题,还得重新回到windows端,这个过程太耗 ...

  3. 源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

    该文章阅读的AFNetworking的版本为3.2.0. 这个分类提供了对请求周期进行控制的方法,包括进度监控.成功和失败的回调. 1.接口文件 1.1.属性 /**网络会话管理者对象*/ @prop ...

  4. 源码阅读:SDWebImage(六)——SDWebImageCoderHelper

    该文章阅读的SDWebImage的版本为4.3.3. 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理. 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算 ...

  5. mybatis源码阅读

    说下mybatis执行一个sql语句的流程 执行语句,事务等SqlSession都交给了excutor,excutor又委托给statementHandler SimpleExecutor:每执行一次 ...

  6. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...

  7. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  8. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  9. 源码阅读:AFNetworking(八)——AFAutoPurgingImageCache

    该文章阅读的AFNetworking的版本为3.2.0. AFAutoPurgingImageCache该类是用来管理内存中图片的缓存. 1.接口文件 1.1.AFImageCache协议 这个协议定 ...

最新文章

  1. protobufjs 命令执行_【原码笔记】-- protobuf.js 与 Long.js
  2. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...
  3. JEESZ架构、分布式服务:Dubbo+Zookeeper+Proxy+Restful
  4. glibc手动升级高版本导致系统(RedHat/Centos)异常(无法开机等)的解决方法(回退低版本glibc)
  5. Angular中提示:Can't bind to 'ngModel' since it isn't a known property of 'input'
  6. 一文详解神经网络模型
  7. 多样性文本生成任务的研究进展
  8. seir模型matlab_疫情专题 | 传染病的经典数学模型
  9. oracle数据库全数据库名,Oracle数据库中的 数据库域名、数据库名、全局数据库名、SID、数据库实例名、服务名 解释...
  10. nginx会将post请求转为get么_前端角度谈GET与POST的区别
  11. mysql8.0导入备份_mysql8.0.20配合binlog2sql的配置和简单备份恢复的步骤详解
  12. TCGA(三)--采用GDC API进行数据查询和获取
  13. php基础知识 书写格式
  14. c语言选择循环实验报告,C语言程序设计实验报告选择与循环结构程序设计.doc
  15. 计算机硬盘坏道解决办法
  16. 大学计算机基础题库百度云资源,《大学计算机基础试题题库及答案》.pdf
  17. 【转】 Pro Android学习笔记(五八):Preferences(2):CheckBoxPreference
  18. 把握人类的八大本能,让你拥有“营销作弊器”
  19. 深度学习---人脸检测(勿喷)
  20. matlab的se是个什么东西

热门文章

  1. 前段切图之ps使用技巧
  2. 2019年9月计算机英语统考,2019年9月网络教育统考大学英语B模拟题6
  3. java取出字符串中的后四位_[原]Java面试题-将字符串中数字提取出来排序后输出...
  4. Elon Musk学习方法研究
  5. JavaScript每日一练经典小案例(二)
  6. Ceph Cache Tier中缓存读写流程源码分析
  7. wavecom 短消息相关 + 短消息中心站
  8. Android NDK cannot locate symbol __register_atfork的一次经典定位分析~
  9. 图像处理-遥感图像飞机小目标提取
  10. SR-TE Policy(思科)----explicit path 实验