使用 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 相关文章推荐
漂亮的仿flash菜单,来自蓝色经典
Jun 26 Javascript
DOM2非标准但却支持很好的几个属性小结
Jan 21 Javascript
js操作滚动条事件实例
Jan 29 Javascript
浅谈jQuery中setInterval()方法
Jul 07 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
3种不同的ContextMenu右键菜单实现代码
Nov 03 Javascript
jquery validation验证表单插件
Jan 07 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
layui弹出层效果实现代码
May 19 Javascript
Js利用console计算代码运行时间的方法示例
Sep 24 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
Sep 25 Javascript
原生JS控制多个滚动条同步跟随滚动效果
Dec 22 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的FTP学习(四)
2006/10/09 PHP
第六节--访问属性和方法
2006/11/16 PHP
php中将网址转换为超链接的函数
2011/09/02 PHP
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
php格式化json函数示例代码
2016/05/12 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
用Juery网页选项卡实现代码
2011/06/13 Javascript
Jquery判断$("#id")获取的对象是否存在的方法
2013/09/25 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
JavaScript缓动动画函数的封装方法
2020/11/25 Javascript
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
浅谈python对象数据的读写权限
2016/09/12 Python
Django验证码的生成与使用示例
2017/05/20 Python
关于numpy数组轴的使用详解
2019/12/05 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
高二物理教学反思
2014/02/08 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
学籍证明模板
2015/06/18 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
GPU服务器的多用户配置方法
2022/07/07 Servers