博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何用 JavaScript 下载文件
阅读量:5158 次
发布时间:2019-06-13

本文共 2481 字,大约阅读时间需要 8 分钟。

简介

我们知道,下载文件是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的 url 来实现下载功能,但是这种用户体验非常不好。

幸好,HTML 5 里面为 <a> 标签添加了一个 download 的属性,我们可以轻易的利用它来实现下载功能,再也不需要用以前的笨办法了。

原理

我们先看看 download 的使用方法:

看看上面的代码,只要为 <a> 标签添加 download 属性,我们点击这个链接的时候就会自动下载文件了~

顺便说下,download 的属性值是可选的,它用来指定下载文件的文件名。像上面的例子中,我们下载到本地的文件名就会是 filename.zip 拉,如果不指定的话,它就会是 somefile.zip 这个名字拉!

事实上,用 JavaScript 来下载文件也是利用这一特性来实现的,我们的 JavaScript 代码不外乎就是:

  • 用 JavaScript 创建一个隐藏的 <a> 标签

  • 设置它的 href 属性

  • 设置它的 download 属性

  • 用 JavaScript 来触发这个它的 click 事件

翻译成 JavaScript 代码就是:

var a = document.createElement('a');var url = window.URL.createObjectURL(blob);var filename = 'what-you-want.txt';a.href = url;a.download = filename;a.click();window.URL.revokeObjectURL(url);

好拉,是不是看到有个陌生的东东呢?

window.URL

window.URL 里面有两个方法:

  • createObjectURL 用 blob 对象来创建一个 object URL(它是一个 DOMString),我们可以用这个 object URL 来表示某个 blob 对象,这个 object URL 可以用在 href 和 src 之类的属性上。

  • revokeObjectURL 释放由 createObjectURL 创建的 object URL,当该 object URL 不需要的时候,我们要主动调用这个方法来获取最佳性能和内存使用。

知道了这两个方法之后,我们再回去看看上面的例子就很容易理解了吧!只是用 blob 对象来创建一条 URL,然后让 <a> 标签引用该 URL,然后触发个点击事件,就可以下载文件了!

那么问题来了,blob 对象哪里来?

Blob 对象

Blob 全称是 Binary large object,它表示一个类文件对象,可以用它来表示一个文件。根据 MDN 上面的说法,File API 也是基于 blob 来实现的。

由于本文的主题是讲 JavaScript 下载文件,那我们构建 blob 的方式就是通过服务器返回的文件来创建 blob 拉!

而最简单的方式就是用 fetch API 了,我们可以整合上面的例子:

fetch('http://somehost/somefile.zip').then(res => res.blob().then(blob => {    var a = document.createElement('a');    var url = window.URL.createObjectURL(blob);    var filename = 'myfile.zip';    a.href = url;    a.download = filename;    a.click();    window.URL.revokeObjectURL(url);}))

很简单对吧!

你可能会问,何必这么麻烦呢?直接写成下面这样不就好了:

嗯,对于这种写法,我只能说,你做的太正确了!如果你要下载的是已经存在服务器上面的静态文件的话,那么写成这样是最方便的。

为什么要用 JavaScript 下载文件

好拉,说了半天,其实我们一直说的都是:「不要用 JavaScript 下载文件拉,限制多多,又不好用,直接用 html 就好拉,简单方便又快捷」这个论调。

事实上也确实如此,但有些时候我们确实需要通过 JavaScript 来做一些预处理。

权限校验

有些时候,我们需要对下载做一些限制,最常见的就是权限校验了,如检查该用户是否有下载的权限,是否有高速下载的权限等等。这时候,我们可以利用 JavaScript 做一些预处理。如:

fetch('http://somehost/check-permission', options).then(res => {    if (res.code === 0) {        var a = document.createElement('a');        var url = res.data.url;        var filename = 'myfile.zip';        a.href = url;        a.download = filename;        a.click();    } else {        alert('You have no permission to download the file!');    }});

在这个例子里面,我们没有用 blob 来构建 URL,而是通过后端服务器来计算出用户的下载链接,然后再利用之前提到的动态创建 <a> 标签的方式来实现下载,很简单吧!

转自:[]http://mp.weixin.qq.com/s/U_LuC2Nyv4ZcNpX0tHDP3g

转载于:https://www.cnblogs.com/longm/p/6565805.html

你可能感兴趣的文章
黑客新手入门
查看>>
PHPSTORM/IntelliJ IDEA 常用 设置配置优化
查看>>
python爬虫入门10.16
查看>>
MVC,MVP 和 MVVM 的图示
查看>>
Sql Server 的DataReader 与 DataSet
查看>>
关于NSA的EternalBlue(永恒之蓝) ms17-010漏洞利用
查看>>
数据结构之B进制(确定进制)
查看>>
python小白-day9 数据库操作与Paramiko模块
查看>>
git push 冲突
查看>>
自然连接(natural join)
查看>>
Python pyspider HTTP 599 错误
查看>>
Data visualization 课程 笔记3
查看>>
Lucene的搭建(3)
查看>>
jsp---tomcat===》》内置对象
查看>>
Linux的文件与目录管理 - 鸟哥Linux私房菜第七章 - 思维导图
查看>>
求数组中最长递增子序列
查看>>
java总结第二次(剩余内容)//类和对象1
查看>>
c++语言中的遍历
查看>>
layui table 行按钮事件,启用禁用切换
查看>>
带参数的文件上传方法&后台接收
查看>>