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

前端很多项目中,都有文件下载的需求,特别是JS生成文件内容,然后让浏览器执行下载操作(例如在线图片编辑、在线代码编辑、iPresst等)。

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

<a href=”file.js”>file.js</a>

用户点击这个链接的时候,浏览器会打开并显示链接指向的文件内容,显然,这并没有实现我们的需求。

HTML5中给a标签增加了一个download属性,只要有这个属性,点击这个链接时浏览器就不在打开链接指向的文件,而是改为下载(目前只有chrome、firefox和opera支持)。

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

Not enough!

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

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

<img src=”data:image/gif;base64,R0lGOXXXXX">

DataURI的解释可以移步这里,本人就不在解释了。

那么,现在要将js生成的内容进行下载就有法可依了。封装成一个方法如下:

1

2

3

4

function downloadFile(aLink, fileName, content){

aLink.download = fileName;

aLink.href = "data:text/plain," + content;

}

调用downloadFile之后,用户点击链接,就能触发浏览器下载。

Not enough!

但是,还不够,上面的办法有两个硬伤,会导致流失很多懒人美眉:

  1. 下载的文件类型限制死了,美眉要下载处理后的果照怎么办?
  2. 下载还要再点击一下,太麻烦啦。

要解决文件类型的问题,可以用浏览器的新API(URL.createObjectURL)来解决问题,URL.createObjectURL通常都是用来创建图片的DataURI用来显示图片,这里用来下载文件,让浏览器来帮我们设定好文件类型。

URL.createObjectURL的参数是File对象或者Blob对象,File对象也就是通过input[type=file]选择的文件,Blob对象是二进制大对象,详细说明可参考这里

现在,我们只要用content创建一个ObjectURL并赋值给aLink即可解决文件类型的限制问题。

文件的自动下载也挺好办,自己构建一个UI点击事件,再自动触发下,就能实现自动下载啦。

现在来看看最终代码:

1

2

3

4

5

6

7

8

9

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-02)Blob和URL.createObjectURL在标准浏览器里面都不再需要加私有前缀,可以放心使用啦啦啦~~如果你不放心,可以查查Can I Use

转载自AlloyTeam:http://www.alloyteam.com/2014/01/use-js-file-download/

时间: 2024-10-12 15:22:41

在浏览器端用JS创建和下载文件的相关文章

js创建并下载文件

先上代码: function createAndDownloadFile(fileName, content) { var aTag = document.createElement('a'); var blob = new Blob([content]); aTag.download = fileName; aTag.href = URL.createObjectURL(blob); aTag.click(); // 模拟点击 URL.revokeObjectURL(blob); } file

IE浏览器下用JS创建文件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

Win10系统IE浏览器能打开网页但无法下载文件的处理方法

在Win10系统中,很多没有安装下载软件的朋友默认就是使用IE来下载文件的,不过部分用户发现使用IE下载时出现点击无反应,无法下载的情况,那么如何解决此类问题呢?原因分析:出现此类情况大多是由于默认下载文件夹不存在引起的具体有如下几种方面.1.Win10系统安装好后修改了系统盘符修改系统盘符,IE浏览器默认的安装位置出现错误,导致IE无法运行,因此无法下载.建议:检查皇冠现金系统盘符是否和安装时的是一致的,若发生变化,把盘符重新改回和原来一致.2.默认下载文件夹不存在默认下载文件夹不存在,IE下

浏览器端的javascript加载器

commonJS,定义了一种同步加载脚本的规范.对于浏览器端而言,因为js脚本都是在远端,用同步的方式可能会长时间阻塞线程.因此,浏览器端的js加载器并不会严格按照commonJS来做.seajs作为一个试图遵循commonJS规范的加载器,是在规范的基础上在外面包一层define,来异步加载js,以下是seajs官网的一个例子: // 所有模块都通过 define 来定义 define(function(require, exports, module) { // 通过 require 引入依

JavaScript 在浏览器端使用

JavaScript 在浏览器端使用 提个醒儿:如果你已经使用过 JS,请忽略本文吧~~ 在浏览器端使用 JS 的方法其实就是通过 script 标签实现的,这个元素是由 Netscape 创造的,当初他们也面临着如何在HTML中使用 JS 的问题,经过一系列的尝试和纠错,最终决定为WEB增加对脚本的支持.<script>定义了以下6个属性: async  可选属性, 使用过ES6语法的都知道这是异步的意思,在这里也正如此,立即下载脚本,但不应妨碍页面中的其他操作,需要注意的是,该属性只对外部

jsp页面下载文件

.将创建的excel文档转换成需要输出的流:可以是文件流放在硬盘中,也可以是输出流输出到浏览器供下载. ◆  文件流:FileOutputStream 1 FileOutputStream fos = new FileOutputStream("F://workbook.xls"); 2 workBook.write(fos); 3 fos.close(); ◆  输出流 :response.getOutputStream() 1 response.reset(); 2 respons

用JS在浏览器中创建下载文件如下可以做到

前端很多项目中,都有文件下载的需求,特别是JS生成文件内容,然后让浏览器执行下载操作(例如在线图片编辑.在线代码编辑.iPresst等 但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开->另存为.如下面这个链接: <a href="file.js">file.js</a> 用户点击这个链接的时候,浏览器会打开并显示链接指向的文件内容,显然,这并没有实现我们的需求.HTML5中给a标签增加了一个download属性,只要有这个属性,点击这个链接

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

前端很多项目中,都有文件下载的需求,特别是JS生成文件内容,然后让浏览器执行下载操作(例如在线图片编辑.在线代码编辑.iPresst等 但受限于浏览器,很多情况下我们都只能给出个链接,让用户点击打开->另存为.如下面这个链接: <a href=”file.js”>file.js</a> 用户点击这个链接的时候,浏览器会打开并显示链接指向的文件内容,显然,这并没有实现我们的需求.HTML5中给a标签增加了一个download属性,只要有这个属性,点击这个链接时浏览器就不在打开链

解除百度云浏览器端对下载大文件的限制

百度网盘对浏览器端下载大文件做了一些限制,当超过一定大小的文件必须使用百度云管家才可以下载,这给用户的使用带来了不便. [不看分析请直接拉到页底] 1. 百度网盘限速原理 当点击下载一个大文件的时候百度网盘会弹出这样一个提示框. 我们给下个断点,看看是什么代码创建了这个提示框. 然后再次点击下载一个大文件,我们发现断点已经断下来了. 可以看出这里是在把提示对话框显示出来,我们需要查看调用栈往上找找. 跳过一些jQuery的操作,我们看到了这样一个函数,继续往上找. 这个isPlatformWin