使用 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 相关文章推荐
JQuery 学习笔记 选择器之二
Jul 23 Javascript
javascript 拖动表格行实现代码
May 05 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
Dec 20 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
Oct 24 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
Dec 17 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
Angular实现跨域(搜索框的下拉列表)
Feb 16 Javascript
利用canvas实现的加载动画效果实例代码
Jul 05 Javascript
详解Vue底部导航栏组件
May 02 Javascript
JS解惑之Object中的key是有序的么
May 06 Javascript
解决vuex刷新状态初始化的方法实现
Aug 15 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
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
php单链表实现代码分享
2016/07/04 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
Yii核心验证器api详解
2016/11/23 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
jQuery 使用手册(四)
2009/09/23 Javascript
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
深入解答关于Python的11道基本面试题
2017/04/01 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
餐饮收银员岗位职责
2014/02/07 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
快餐公司创业计划书
2014/04/29 职场文书
大学生工作自荐书
2014/06/16 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
企业宣传稿范文
2015/07/23 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书