使用 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 插件之仿“卓越亚马逊”首页弹出菜单效果
Dec 25 Javascript
JavaScript 浏览器验证代码(来自discuz)
Jul 17 Javascript
JS模块与命名空间的介绍
Mar 22 Javascript
jquery ajax属性async(同步异步)示例
Nov 05 Javascript
javascript删除option选项的多种方法总结
Nov 22 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
Nov 17 Javascript
jquery validation验证表单插件
Jan 07 Javascript
jQuery中each方法的使用详解
Mar 18 jQuery
jQuery实现的简单对话框拖动功能示例
Jun 05 jQuery
深入理解移动前端开发之viewport
Oct 19 Javascript
微信小程序实现底部导航
Nov 05 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
Sep 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
PHP 转义使用详解
2013/07/15 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
Python实现端口复用实例代码
2014/07/03 Python
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
Python如何获取系统iops示例代码
2016/09/06 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
五一服装活动方案
2014/01/11 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
销售员岗位职责
2015/02/10 职场文书
怎样写辞职信
2015/02/27 职场文书
匿名检举信范文
2015/03/02 职场文书
2015年教师节活动总结
2015/03/20 职场文书
培根随笔读书笔记
2015/07/01 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
java项目构建Gradle的使用教程
2022/03/24 Java/Android