用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+xml自动生成表格的东西
Dec 21 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
Jan 15 Javascript
js 火狐下取本地路径实现思路
Apr 02 Javascript
jquery map方法使用示例
Apr 23 Javascript
js防止页面被iframe调用的方法
Oct 30 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
Dec 18 Javascript
Bootstrap每天必学之按钮(Button)插件
Apr 25 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
May 17 Javascript
AngularJs ng-route路由详解及实例代码
Sep 14 Javascript
JS实现滑动门效果的方法详解
Dec 19 Javascript
JavaScript如何获取一个元素的样式信息
Jul 29 Javascript
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
使用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安全配置
2006/10/09 PHP
php 获取完整url地址
2008/12/20 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
JavaScript中null与undefined分析
2009/07/25 Javascript
jquery 常用操作方法
2010/01/28 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
Python 字符串大小写转换的简单实例
2017/01/21 Python
Python内置函数delattr的具体用法
2017/11/23 Python
python3.6实现学生信息管理系统
2019/02/21 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
缅怀革命先烈演讲稿
2014/05/14 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
新郎结婚感言
2015/07/31 职场文书