使用 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 相关文章推荐
父子窗体间传递JSON格式的数据的代码
Dec 25 Javascript
javascript向后台传送相同属性的参数即数组参数
Feb 17 Javascript
js操作cookie保存浏览记录的方法
Dec 25 Javascript
AngularJS教程之简单应用程序示例
Aug 16 Javascript
Javascript之面向对象--封装
Dec 02 Javascript
微信小程序中多个页面传参通信的学习与实践
May 05 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
Sep 13 Javascript
vue-cli webpack 引入jquery的方法
Jan 10 jQuery
javascript与PHP动态往类中添加方法对比
Mar 21 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
May 30 Javascript
react-native滑动吸顶效果的实现过程
Jun 03 Javascript
在vue中使用jsonp进行跨域请求接口操作
Oct 29 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缓存技术介绍
2006/11/25 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
Python3网络爬虫中的requests高级用法详解
2019/06/18 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
几道PHP的面试题
2012/05/19 面试题
社区创先争优承诺书
2014/08/30 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
教师素质教育心得体会
2016/01/19 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
Python WSGI 规范简介
2021/04/11 Python
python超详细实现完整学生成绩管理系统
2022/03/17 Python