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

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

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

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

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

下载时会直接使用链接的名字来作为文件名,但是是可以改的,只要给download加上想要的文件名即可,如:download=“not-a-file.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,文件就自动下载

时间: 2024-11-08 16:28:24

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

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

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

报表XML导出rtf格式,结果在浏览器中打开XML文件。用360浏览器下载rtf文件打开后出现Authentication failed 问题

报表XML导出rtf格式,结果在浏览器中打开XML文件.用360浏览器下载rtf文件打开后出现Authentication failed 问题 直接上问题图: 问题描述:在Oracle EBS中执行"资源事务处理 XML"请求,选择输出rtf格式,完成后查看输出,却在浏览器中打开了XML文件.        提示:需要检查一下是否有对应的模板文件和模板定义有效时间.        解决方案:1. 查看日志. 从中可以看出出错原因,以及模板代码.2. 添加Oracle XML Publi

怎么用OCR图文识别软件在MS Office中创建PDF文件

ABBYY PDF Transformer+是一款可创建.编辑及将PDF文件转换为其他可编辑格式的OCR图文识别软件,不仅可以从纸质文档.图像文件和任何其他流行格式创建PDF文件(相关文章请参考如何从文件创建ABBYY PDF Transformer+ PDF文档),还可以从MS Office中创建PDF文件,本文为大家详解如何使用ABBYY PDF Transformer+从MS Office中轻松创建PDF文件. 本文仅以Microsoft Word为例,MS的其他应用程序操作步骤类似. 步

js打开新的链接下载文件

var p =params.join("&"); var a = document.createElement('a'); a.href = 'report/exportpubcount.do'+p; a.target = '_blank'; a.id='exppub'; document.body.appendChild(a); var alink = document.getElementById('exppub'); alink.click(); alink.parent

Java Web实现使用浏览器从服务器下载文件(后台)

Java Web实现 使用浏览器从服务器下载文件. 下面实现两种情况的下载,需求如下: 需求(一):1.用户在页面填写表单. 2.填写完成后,选择下载,将表单内容发往后台. 3.后台根据内容生产一个文件,发送给前端. 4.前端成功下载文件到本地. 此需求简单来说就是,用户在页面上填写内容,然后将内容转变成文件的形式. 后台设计思路:1.首先拿到前端发送过来的内容. 2.将内容解析,存放至缓冲区. 3.设置响应头. 4.将缓冲区里的内容,以流的方式写出. 代码实现: public void dow

微信中打开第三方网页,怎么解决不打开浏览器就能够下载文件

文章背景 在微信中,打开app下载链接,或者使用微信扫一扫app下载二维码,都是无法下载app的.因为腾讯为了自身利益,屏蔽了其他app直接在微信中下载. 而访问指定网页的链接在微信内分享转发次数多了就会被微信拦截,用户打开提示“已停止访问该网址”.这也是腾讯对第三方网页内容含敏感词或者被人举报次数过多的域名实行的拦截方案. 那么此时如果想解决这个问题的话,必不可少的方案就是能实现微信内跳转到手机浏览器打开网页或者下载APP,下面为大家介绍的一种方案,可实现微信内直接下载APP或跳转浏览器打开网

js 在浏览器中的限制

众所周知,由于安全方面的考虑,运行在浏览器中的JS脚本会被存在很多限制,这里做一下小小的归纳: 1.JS不允许访问宿主的计算机: js原本是不能读取或写入用户计算机的文件系统的(cookie除外),但是HTML5新增的file API,能让我们能突破这个限制(但是仍然有其他限制条件,有兴趣的同学可以参考http://www.html5rocks.com/zh/tutorials/file/filesystem/). 2.同源策略: 这个大家应该都知道,就是两个页面的域必须相同,才允许相互通信.

浏览器发送总共下载文件2第二个请求,如何“下载”仅仅记录1次要?

近期,个人官网实现了PDF下载功能,出于统计的考虑.添加了"下载次数"download_count这个字段. 可是.我今天突然发现.每次下载download_count都直接+2了.假设server发生这样的事,另一定的可能,本地就我一个人下载,怎么可能下载2次. 于是,打开了log4j的debug模式.果然运行了2次更新请求. @RequestMapping(value = "/download/pdf") public void downloadPdf(@Req

微信浏览器不支持下载文件或应用解决方案--跳转到默认浏览器打开

在微信的内置浏览器(QQ内置浏览器也一样)里他屏蔽了下载链接,不管是app的下载链接,还是普通文件的链接都屏蔽了,这个问题有两个解决方案. 首先如果你是App下载链接就传到腾讯应用宝,但是这会给应用宝带来流量,如果二次下载折损率很高.其二就是提示引导用户在浏览器打开所以如果你没有将软件上传到应用宝里,或者你的文件不是APP,那么就需要第二种方法了,首先是需要判断用户的浏览器是否为微信内置浏览器,如果是弹出一个图层,提示用户点击右上角的三个点,然后点击在浏览器中打开即可.但是这种用户体验很差.经过