用JS在浏览器中创建下载文件

但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开-》另存为。如下面这个链接:

file.js

用户点击这个链接的时候,浏览器会打开并显示链接指向的文件内容,显然,这并没有实现我们的需求。HTML5中给a标签增加了一个download属性,只要有这个属性,点击这个链接时浏览器就不在打开链接指向的文件,而是改为下载(目前只有chrome、firefox和opera支持)。

下载时会直接使用链接的名字来作为文件名,但是是可以改的,只要给download加上想要的文件名即可,如:download=“not-a-file.js”。

但是这样还不够,以上的方法只适合用在文件是在服务器上的情况。如果在浏览器端js生成的内容,想让浏览器进行下载要如何办到呢?

其实还是有办法办到的,相信很多人都多少听过了DataURI这个词,比较常见的就是图片的src,如:

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。相关阅读:

Linux系统中使用netcat命令的奇技淫巧

PHP中使用hidef扩展代替define提高性能

javascript中String对象的slice()方法分析

PHP常用文件操作函数和简单实例分析

MySQL命令行导出与导入数据库

jquery实现表格本地排序的方法

三款Android炫酷Loading动画组件推荐

很实用的js选项卡切换效果

JavaScript实现的简单幂函数实例

node-webkit打包成exe文件被360误报木马的解决方法

jquery中post方法用法实例

修改SQL-SERVER数据库表结构的SQL命令附sql命令行修改数据库

使用电脑管家升级Win10却检测用户账户类型不支持该怎么办?

PHP5.3以上版本安装ZendOptimizer扩展

js如何在浏览器中运行php文件下载,JavaScript_用JS在浏览器中创建下载文件,但受限于浏览器,很多情况下 - phpStudy...相关推荐

  1. mac怎么删除下载文件及MAC电脑浏览器如何清除缓存?

    很多用户在浏览器下载了很多文件,可能只打开过一次就再也没有使用过,也不知道怎么删除,等存储空间不够了才想起删除下载文件或者清理浏览器缓存.今天小编就来教大家mac怎么删除下载的文件,以及macbook ...

  2. 微信公众号下载文件(避开微信浏览器的文件下载方法)

    微信浏览器是屏蔽资源文件下载的,但是微信公众号内如何下载文件呢.只能借助于在其他浏览器打开,也就是跳到其他浏览器进行下载(如图). 具体的逻辑很简单,就是在需要下载的位置比如:是一个单击事件 < ...

  3. Java实现FTP下载文件到客户端(浏览器)

    目录 一.简介 二.maven依赖 三.配置类 四.工具类 4.1.服务器文件名中文处理 4.2.下载文件名中文处理 五.接口验证 一.简介   我在之前的文章(Java实现文件上传和下载)里讲过非F ...

  4. java byte 图片浏览器直接显示_以Spring Boot的方式显示图片或下载文件到浏览器的示例代码...

    以Java web的方式显示图片到浏览器以Java web的方式下载服务器文件到浏览器 以Spring Boot的方式显示图片或下载文件到浏览器 请求例子:http://localhost:8080/ ...

  5. matlab怎么新建文件运行不了,如何使用MathWorks的MATLAB程序创建脚本文件

    描述 步骤1:打开程序 首先,应打开并使用所使用的计算机.在桌面上,单击左下角的Windows按钮(Windows版本Vista,7和8,先前版本的开始按钮),然后搜索程序MATLAB.双击文本&qu ...

  6. crt中 新建的连接存储在哪_SecureCRT上传和下载文件(下载默认目录)

    SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. Xmodem:这种古老的传输协议速度较慢,但由于使 ...

  7. Redis 中的 持久化 RDB持久化 SAVE:阻塞服务器并创建RDB文件 BGSAVE:以非阻塞方式创建RDB文件 通过配置选项自动创建RDB文件

    这里写目录标题 15.1 RDB持久化 15.1.1 SAVE:阻塞服务器并创建RDB文件 其他信息 15.1.2 BGSAVE:以非阻塞方式创建RDB文件 其他信息 15.1.3 通过配置选项自动创 ...

  8. linux中运行c找不到conio.h,linux中无 conio.h的解决办法

    conio.h不是C标准库中的头文件,在ISO和POSIX标准中均没有定义.conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函 ...

  9. java文件下载时文件类型_Java基础之文件下载实现自定义名称和格式类型-java下载文件...

    response.setContentType()的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据,可以设置文件格式.参考数据如下: re ...

最新文章

  1. JavaScript如何中断循环执行?
  2. iostat来对linux硬盘IO性能进行了解
  3. for循环利用可迭代对象与迭代器完成工作的本质
  4. freeMarker 遍历 list,map,listmap
  5. AngularJS 内置指令
  6. Objective-c的内存管理MRC与ARC
  7. 构建高性能数据库缓存之redis主从复制
  8. 洛谷——[USACO07OCT]Bessie‘s Secret Pasture S
  9. Ubuntu下Hadoop的安装和配置
  10. matlab的默认字体_matlab画图字体 matlab默认的字体是什么
  11. 达梦数据库DM8企业版--命令行方式的安装、创建数据库和注册服务
  12. 【软件测试学习笔记】黑盒测试方法及案例
  13. 云计算是什么,阿里云提供哪些云服务
  14. 计算机 玩体感游戏,Wii模拟器Dolphin完全教学 PC上也来玩体感
  15. 用u盘linux系统视频,用U盘怎么安装Linux系统
  16. Linux怎么改引导方式为uefi,联想电脑怎么将uefi改成legacy启动|uefi改成legacy引导模式...
  17. arduino编乐谱_基于Arduino的电子音乐发声器设计
  18. CSS一篇文章搞懂系列6:超全的字体篇与背景设置内容,花里胡哨起来
  19. 前端技术的趋势和最新的发展
  20. js如何保留两位小数

热门文章

  1. ESP8266-01模块接入巴法云,SmartConfig智能配网,设置断电记忆模式,可以使用米家控制和普通开关控制
  2. 三只小猪的故事,《三只小猪的故事》读后感
  3. 机械、电子、计算机类优秀的论坛或者网站
  4. ERROR: JAVA_HOME is set to an invalid directory
  5. HBase系列从入门到精通(二)
  6. 逻辑题:三个小伙子同时爱上一个姑娘
  7. Js 异步请求按顺序调用解决方案(真实工作场景,axios
  8. 趋势、马丁、对冲结合ea的编程实践(八)编程思路分享及效果展示
  9. creative thoughts开源软件
  10. 拥抱 Web3,如何与 NFT 项目和社区建立合作关系?