Jimliu


一只刚上路的前端程序猿


前端下载文件

简介

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

1
<a href="http://somehost/somefile.zip" download="filename.zip">下载文件</a>

上面的例子就是HTML5下载文件 添加download属性 下载的文件名就为filename.zip

当然我们也可以使用javascript来进行操作

1
2
3
4
5
6
7
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 全称是 Binary large object,它表示一个类文件对象,可以用它来表示一个文件。根据 MDN 上面的说法,File API 也是基于 blob 来实现的。

我们接下来用fetch的方式来实现刚才的下载代码

1
2
3
4
5
6
7
8
9
10

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);
}))
最近的文章

用户权限系统设计

于  系统 继续阅读
更早的文章

centos安装node-canvas的那些坑!

坑一node-canvas包在build的时候 需要c11,所以最低的gcc版本应该为gcc 4.7。但是许多centos系统中安装的gcc默认版本为Gcc 4.4.7.导致node-canvas安装不成功。需要将服务器的gcc版本更新。 坑二我们侥幸的开了 gcc版本的坑,还需要安装cairo …

于  linux, node 继续阅读