使用 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 读取XML数据,在页面中展现、编辑、保存的实现
Oct 27 Javascript
javascript 匿名函数的理解(透彻版)
Jan 28 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
Jul 04 Javascript
各浏览器对document.getElementById等方法的实现差异解析
Dec 05 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
Dec 20 Javascript
js 数值转换为3位逗号分隔的示例代码
Feb 19 Javascript
js对字符的验证方法汇总
Feb 04 Javascript
14 个折磨人的 JavaScript 面试题
Aug 08 Javascript
JavaScript编写一个贪吃蛇游戏
Mar 09 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 Javascript
mpvue将vue项目转换为小程序
Sep 30 Javascript
JavaScript读取本地文件常用方法流程解析
Oct 12 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分页显示制作详细讲解
2008/11/19 PHP
PHP 操作文件的一些FAQ总结
2009/02/12 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
微信API接口大全
2015/04/15 PHP
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
Python  连接字符串(join %)
2008/09/06 Python
python实现井字棋游戏
2020/03/30 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
Python实现打印实心和空心菱形
2019/11/23 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
浙江文明网签名寄语
2014/01/18 职场文书
春节联欢会主持词
2014/03/24 职场文书
钳工实训报告总结
2014/11/04 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书