用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得到网页中所有的div的id
Oct 19 Javascript
javascript中的变量是传值还是传址的?
Apr 19 Javascript
jquery实现心算练习代码
Dec 06 Javascript
全面理解面向对象的 JavaScript(来自ibm)
Nov 10 Javascript
JavaScript 事件绑定及深入
Apr 13 Javascript
JS实现点击事件统计的简单实例
Jul 10 Javascript
js 输入框 正则表达式(菜鸟必看教程)
Feb 19 Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 Javascript
JavaScript ES6中的简写语法总结与使用技巧
Dec 30 Javascript
微信小程序实现购物车代码实例详解
Aug 29 Javascript
解决layer弹出层msg的文字不显示的问题
Sep 11 Javascript
js数组中去除重复值的几种方法
Aug 03 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 默默经典版本
2009/08/04 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PHP中的事务使用实例
2015/05/26 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python subprocess库的使用详解
2018/10/26 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
Python修改DBF文件指定列
2020/12/19 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
单位活动策划方案
2014/08/17 职场文书
民事赔偿协议书
2014/11/02 职场文书
先进个人自荐书
2015/03/06 职场文书
教师外出学习心得体会
2016/01/18 职场文书
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android