使用 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 相关文章推荐
JavaScript获取GridView中用户点击控件的行号,列号
Apr 14 Javascript
一个JQuery操作Table的代码分享
Mar 30 Javascript
JavaScript中的作用域链和闭包
Jun 30 Javascript
常见表单重复提交问题整理及解决方法
Nov 13 Javascript
jQuery实现摸拟alert提示框
May 22 Javascript
jQuery UI制作选项卡(tabs)
Dec 13 Javascript
jQuery代码实现实时获取时间
Jan 29 Javascript
详解基于node的前端项目编译时内存溢出问题
Aug 01 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
Jul 11 Javascript
给localStorage设置一个过期时间的方法分享
Nov 06 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
Sep 20 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
一个ftp类(ini.php)
2006/10/09 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
Mongoose中document与object的区别示例详解
2017/09/18 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
python实现的重启关机程序实例
2014/08/21 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
Python插件机制实现详解
2020/05/04 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
网络体系结构及协议的定义
2014/03/13 面试题
介绍一下linux文件系统分配策略
2012/11/17 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
爱情检讨书大全
2014/01/21 职场文书
会计学自我鉴定
2014/02/06 职场文书
现金出纳岗位职责
2014/03/15 职场文书
大学生实习证明
2015/06/16 职场文书
个人催款函范文
2015/06/23 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers