用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 相关文章推荐
二级域名或跨域共享Cookies的实现方法
Aug 07 Javascript
IE6下js通过css隐藏select的一个bug
Aug 16 Javascript
基于jQuery的自动完成插件
Feb 03 Javascript
基于jQuery的图片左右无缝滚动插件
May 23 Javascript
js jquery获取随机生成id的服务器控件的三种方法
Jul 11 Javascript
JavaScript插件化开发教程(五)
Feb 01 Javascript
javascript实现textarea中tab键的缩排处理方法
Jun 26 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
VUE开发一个图片轮播的组件示例代码
Mar 06 Javascript
iview table高度动态设置方法
Mar 14 Javascript
js实现简单模态框实例
Nov 16 Javascript
vue制作toast组件npm包示例代码
Oct 29 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
python数字图像处理之高级滤波代码详解
2017/11/23 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
Python 音频生成器的实现示例
2019/12/24 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
HTML5之语义标签介绍
2016/07/07 HTML / CSS
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
初中同学聚会邀请函
2014/02/03 职场文书
面试必备的求职信
2014/05/25 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
离婚代理词范文
2015/05/23 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
高中政治教学反思
2016/02/23 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
宝塔更新Python及Flask项目的部署
2022/04/11 Python