使用 JavaScript 创建并下载文件(模拟点击)


Posted in Javascript onOctober 25, 2019

先上代码

/**
 * 创建并下载文件
 * @param {String} fileName 文件名
 * @param {String} content 文件内容
 */
function createAndDownloadFile(fileName, content) {
 var aTag = document.createElement('a');
 var blob = new Blob([content]);
 aTag.download = fileName;
 aTag.href = URL.createObjectURL(blob);
 aTag.click();
 URL.revokeObjectURL(blob);
}

很简单对吧,直接调用这个方法,传入文件名和文件内容,程序新建 a 标签,新建 Blob 对象,将文件名赋给 a 标签,同时将 Blob 对象作为 Url 也赋给 a 标签,模拟点击事件,自动下载成功,最后再回收内存。下面我们来看看具体是怎么操作的。

使用 JavaScript 创建并下载文件(模拟点击)

Blob 对象

Blob 对象是一个字节序列。拥有 size 和 type 等属性。

拥有 2 个只读状态 OPEND 和 CLOSED

Blob 对象属于 JavaScript Web APIs 中的 File API 规定的部分,可以参考 W3C 文档中的 The Blob Interface and Binary Data

再回来看看我们的代码里是这么写的,使用了 Blob 的构造函数:

var blob = new Blob([content]);

使用方括号的原因是,其构造函数的参数为以下4中:

  • ArrayBuffer [TypedArrays] elements.
  • ArrayBufferView [TypedArrays] elements.
  • Blob elements.
  • DOMString [WebIDL] elements.

所谓 ArrayBuffer 是一种用于呈现通用、固定长度的二进制数据的类型。详情可以参考 ArrayBuffer -MDN 以及 ECMAScript2015 标准中的 ArrayBuffer。

Blob URLs

Blob URLs 被创建或注销是使用 URL 对象上的方法。这个 URL 对象被挂在 Window (HTML) 对象下,或者 WorkerGlobalScope (Web Workers)对象下。

拥有以下静态方法 createObjectURL 和 revokeObjectURL,用于创建一个 blob 对象的 url 和注销这个 blob url。

详情可查看 关于创建和注销 Blob URL 的 W3C 标准文档

模拟 click

element.click();

在 W3C 中很早就有这个规范,不需要写繁琐的模拟事件触发的代码。

小结

目前我将这个技术使用在 天猫双十一技术和UED庆功会 的摇火箭大屏游戏中。最后的游戏结果排名,在请求了接口后,在前端直接生成并下载到了本地,作为记录保存。主要也是因为服务端暂时没有提供这个一张表去记录游戏结果,于是采用了前端记录的解决方案。

大家当时都玩的好开心啊,?。你们的甘其食和全家卡的名单就是这样生成的!

Javascript 相关文章推荐
图片上传即时显示缩略图的js代码
May 27 Javascript
来自国外的页面JavaScript文件优化
Dec 08 Javascript
json2.js的初步学习与了解
Oct 06 Javascript
面向对象Javascript核心支持代码分享
May 23 Javascript
深入理解JavaScript中的预解析
Jan 04 Javascript
收藏AngularJS中最重要的核心功能
Jul 09 Javascript
js+html获取系统当前时间
Nov 10 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
Aug 08 Javascript
解决angularjs WdatePicker ng-model的问题
Sep 13 Javascript
layui layer select 选择被遮挡的解决方法
Sep 21 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
Feb 14 Javascript
js前端如何写一个精确的倒计时代码
Oct 25 #Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 #Javascript
layui实现数据表格隐藏列的示例
Oct 25 #Javascript
关于在LayUI中使用AJAX提交巨坑记录
Oct 25 #Javascript
浅谈layui 绑定form submit提交表单的注意事项
Oct 25 #Javascript
详解如何在Vue项目中发送jsonp请求
Oct 25 #Javascript
layui实现form表单同时提交数据和文件的代码
Oct 25 #Javascript
You might like
PHP5 的对象赋值机制介绍
2011/08/02 PHP
分享一段php获取linux服务器状态的代码
2014/05/27 PHP
php实现socket推送技术的示例
2017/12/20 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
ext监听事件方法[初级篇]
2008/04/27 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
python代码制作configure文件示例
2014/07/28 Python
Python中input和raw_input的一点区别
2014/10/21 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python实现随机选择元素功能
2017/09/14 Python
python如何实现内容写在图片上
2018/03/23 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
python各类经纬度转换的实例代码
2019/08/08 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
Python高并发和多线程有什么关系
2020/11/14 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
机关职员工作检讨书
2014/10/23 职场文书
2014年审计工作总结
2014/11/17 职场文书
钱学森电影观后感
2015/06/04 职场文书
欠条样本
2015/07/03 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书