用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 相关文章推荐
实现连缀调用的map方法(prototype)
Aug 05 Javascript
jquery实现checkbox全选全不选的简单实例
Dec 31 Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 Javascript
Vue概念及常见命令介绍(1)
Dec 08 Javascript
js中数组常用方法总结(推荐)
Apr 09 Javascript
JS+CSS3实现的简易钟表效果示例
Apr 13 Javascript
layui插件表单验证提交触发提交的例子
Sep 09 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
May 29 Javascript
javascript中正则表达式语法详解
Aug 07 Javascript
JS实现简单贪吃蛇小游戏
Oct 28 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
Nov 11 Javascript
如何利用js在两个html窗口间通信
Apr 27 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
解决File size limit exceeded 错误的方法
2013/06/14 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
python 调用HBase的简单实例
2016/12/18 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
python3处理含有中文的url方法
2018/05/10 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
python爬取淘宝商品销量信息
2018/11/16 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
Python3最长回文子串算法示例
2019/03/04 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
python中def是做什么的
2020/06/10 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
Python执行时间的几种计算方法
2020/07/31 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
好人好事事迹材料
2014/02/12 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
浅析Django接口版本控制
2021/06/26 Python