用JS在浏览器中创建下载文件


Posted in Javascript onMarch 05, 2014

但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开-》另存为。如下面这个链接:

<a href=”file.js”>file.js</a>

用户点击这个链接的时候,浏览器会打开并显示链接指向的文件内容,显然,这并没有实现我们的需求。HTML5中给a标签增加了一个download属性,只要有这个属性,点击这个链接时浏览器就不在打开链接指向的文件,而是改为下载(目前只有chrome、firefox和opera支持)。

用JS在浏览器中创建下载文件

下载时会直接使用链接的名字来作为文件名,但是是可以改的,只要给download加上想要的文件名即可,如:download=“not-a-file.js”。

用JS在浏览器中创建下载文件

但是这样还不够,以上的方法只适合用在文件是在服务器上的情况。如果在浏览器端js生成的内容,想让浏览器进行下载要如何办到呢?

其实还是有办法办到的,相信很多人都多少听过了DataURI这个词,比较常见的就是图片的src,如:

<img src=”data:image/gif;base64,R0lGOXXXXX">

DataURI的解释可以移步这里,本人就不在解释了。

那么,现在要将js生成的内容进行下载就有法可依了。封装成一个方法如下:

function downloadFile(aLink, fileName, content){
    aLink.download = fileName;

    aLink.href = "data:text/plain," + content;

}

调用downloadFile之后,用户点击链接,就能触发浏览器下载。

但是,还不够,上面的办法有两个硬伤,会导致流失很多懒人美眉:

下载的文件类型限制死了,美眉要下载处理后的果照怎么办?
下载还要再点击一下,太麻烦啦。
要解决文件类型的问题,可以用浏览器的新API(URL.createObjectURL)来解决问题,URL.createObjectURL通常都是用来创建图片的DataURI用来显示图片,这里用来下载文件,让浏览器来帮我们设定好文件类型。

URL.createObjectURL的参数是File对象或者Blob对象,File对象也就是通过input[type=file]选择的文件,Blob对象是二进制大对象,详细说明可参考这里。

现在,我们只要用content创建一个ObjectURL并赋值给aLink即可解决文件类型的限制问题。
文件的自动下载也挺好办,自己构建一个UI点击事件,再自动触发下,就能实现自动下载啦。

现在来看看最终代码:

function downloadFile(fileName, content){
    var aLink = document.createElement('a');

    var blob = new Blob([content]);

    var evt = document.createEvent("HTMLEvents");

    evt.initEvent("click", false, false);//initEvent 不加后两个参数在FF下会报错, 感谢 Barret Lee 的反馈

    aLink.download = fileName;

    aLink.href = URL.createObjectURL(blob);

    aLink.dispatchEvent(evt);

}

现在,只要一调用downloadFile,文件就自动下载了,是不是很爽咧,^_^。

注:目前(2014-01)Blob和URL.createObjectURL在标准浏览器里面都不再需要加私有前缀,可以放心使用啦啦啦~~如果你不放心,可以查查Can I Use。

Javascript 相关文章推荐
ext实现完整的登录代码
Aug 08 Javascript
Prototype String对象 学习
Jul 19 Javascript
js实现的点击div区域外隐藏div区域
Jun 30 Javascript
删除Javascript Object中间的key
Nov 18 Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 Javascript
Javascript字符串常用方法详解
Jul 21 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
May 03 Javascript
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
vsCode安装使用教程和插件安装方法
Aug 24 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
Jan 08 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
Sep 21 jQuery
react实现移动端下拉菜单的示例代码
Jan 16 Javascript
使用iframe window的scroll方法控制iframe页面滚动
Mar 05 #Javascript
js写的方法实现上传图片之后查看大图
Mar 05 #Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
Mar 05 #Javascript
JSON中双引号的轮回使用过程中一定要小心
Mar 05 #Javascript
关于jQuery中的each方法(jQuery到底干了什么)
Mar 05 #Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
Mar 05 #Javascript
js时间比较示例分享(日期比较)
Mar 05 #Javascript
You might like
php 获取本地IP代码
2013/06/23 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
jQuery .tmpl() 用法示例介绍
2014/08/21 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
详解python实现线程安全的单例模式
2018/03/05 Python
儿童学习python的一些小技巧
2018/05/27 Python
对Python实现累加函数的方法详解
2019/01/23 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
wxpython布局的实现方法
2019/11/01 Python
python 画函数曲线示例
2019/12/04 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
房地产销售计划书
2014/01/10 职场文书
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
升学宴演讲稿
2014/09/01 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
金秋助学感谢信
2015/01/21 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
Windows server 2016服务器基本设置
2022/08/14 Servers