使用 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 Select操作方法集合脚本之家特别版
May 17 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
基于jquery自定义图片热区效果
Jul 21 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
Jan 22 Javascript
jQuery自定义多选下拉框效果
Jun 19 jQuery
Angular实现的简单定时器功能示例
Dec 28 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
Jan 08 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
Sep 24 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
Sep 02 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
Nov 09 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
PHP nl2br函数 将换行字符转成 <br>
2009/08/21 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
html文本框提示效果的示例代码
2014/06/28 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
浅谈Node模块系统及其模式
2017/11/17 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
python在windows下实现备份程序实例
2014/07/04 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
python数据分析:关键字提取方式
2020/02/24 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
大学毕业生简单自荐信
2013/11/05 职场文书
生日宴会答谢词
2014/01/09 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
小学教师寄语大全
2014/04/03 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
师德师风自我评价范文
2014/09/11 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
大学运动会加油稿
2015/07/22 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis