用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 相关文章推荐
jQuery初学:find()方法及children方法的区别分析
Jan 31 Javascript
jQuery 源码分析笔记(2) 变量列表
May 28 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
Dec 30 Javascript
加随机数引入脚本不让浏览器读取缓存
Sep 04 Javascript
Javascript中数组方法汇总(推荐)
Apr 01 Javascript
深入理解angularjs过滤器
May 25 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
浅谈Vuex的状态管理(全家桶)
Nov 04 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
js实现登录拖拽窗口
Feb 10 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
Feb 15 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(1)
2006/10/09 PHP
用PHP调用数据库的存贮过程!
2006/10/09 PHP
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
一个PHP分页类的代码
2011/05/18 PHP
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python操作串口的方法
2015/06/17 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
python 利用zmail库发送邮件
2020/09/11 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
英文简历自荐信范文
2013/12/11 职场文书
给同学的道歉信
2014/01/16 职场文书
农行心得体会
2014/09/02 职场文书
百万英镑观后感
2015/06/09 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
JavaScript组合继承详解
2021/11/07 Javascript