用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 相关文章推荐
js字符串完全替换函数分享
Dec 03 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
May 21 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
Jun 02 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
Aug 09 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
Sep 24 Javascript
jQuery动态生成表格及右键菜单功能示例
Jan 13 Javascript
ionic2自定义cordova插件开发以及使用(Android)
Jun 19 Javascript
微信小程序实现弹出菜单功能
Jun 12 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
Nov 04 Javascript
js实现弹幕飞机效果
Aug 27 Javascript
element-ui tree结构实现增删改自定义功能代码
Aug 31 Javascript
原生js实现俄罗斯方块
Oct 20 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
建立文件交换功能的脚本(一)
2006/10/09 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
JavaScript返回网页中锚点数目的方法
2015/04/03 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
室内趣味活动方案
2014/08/24 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
Linux安装Nginx步骤详解
2021/03/31 Servers
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis