用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 相关文章推荐
javascript中的作用域scope介绍
Dec 28 Javascript
jQuery实现单击和鼠标感应事件
Feb 01 Javascript
prototype框架中美元符号$用法分析
Jan 22 Javascript
快速使用Bootstrap搭建传送带
May 06 Javascript
微信小程序 开发之快递查询功能的实现
Jan 09 Javascript
jquery ajaxfileupload异步上传插件使用详解
Feb 08 Javascript
Vue 单文件中的数据传递示例
Mar 21 Javascript
JS实现按钮颜色切换效果
Sep 05 Javascript
详解如何从零开始搭建Express+Vue开发环境
Jul 17 Javascript
微信小程序返回箭头跳转到指定页面实例解析
Oct 08 Javascript
vuejs中父子组件之间通信方法实例详解
Jan 17 Javascript
JavaScript 数组去重详解
Sep 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
杏林同学录(六)
2006/10/09 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
PHP文件上传类实例详解
2016/04/08 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
2006/10/19 Javascript
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
jquery中:input和input的区别分析
2011/07/13 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
浅析$(function) ready和onload 的区别
2016/09/03 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
Python实现新浪博客备份的方法
2016/04/27 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
NumPy排序的实现
2020/01/21 Python
校园标语大全
2014/06/19 职场文书
建党伟业观后感
2015/06/01 职场文书
党员转正介绍人意见
2015/06/03 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python