用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 相关文章推荐
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
jQuery列表拖动排列具体实现
Nov 04 Javascript
Javascript和Java获取各种form表单信息的简单实例
Feb 14 Javascript
js实现楼层效果的简单实例
Jul 15 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
Sep 27 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
Dec 26 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 Javascript
Angular.js组件之input mask对input输入进行格式化详解
Jul 10 Javascript
Vue仿微信app页面跳转动画效果
Aug 21 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
Mar 02 Javascript
Vue之封装公用变量以及实现方式
Jul 31 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实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
Python实现二叉搜索树
2016/02/03 Python
浅谈Python基础之I/O模型
2017/05/11 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
django API 中接口的互相调用实例
2020/04/01 Python
python opencv实现简易画图板
2020/08/27 Python
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
信息专业大学生自我评价分享
2014/01/17 职场文书
信息专业学生学习的自我评价
2014/02/17 职场文书
数学检讨书1000字
2014/02/24 职场文书
授权委托书(完整版)
2014/09/10 职场文书
限期整改通知书
2015/04/22 职场文书
党员个人承诺书
2015/04/27 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
导游词之日本富士山
2020/01/06 职场文书
javaScript Array api梳理
2021/03/31 Javascript
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL