浏览器中文件下载

“浏览器”堪称是计算机历史中一项伟大的发明!互联网早期的应用都是专有应用,都是针对某个领域特殊制作的特殊应用,自从有了浏览器,人们可以看到更轻便和更丰富的内容,这才算走入了寻常百姓家。

今天发现浏览器有个行为令我十分不解,有些文件的链接放在浏览器里面是直接下载的,而有些则被浏览器直接打开而没有下载。

  • 直接下载的链接

    1
    http://qcloudoss.xunjiepdf.com/xunjiepdf/temp/20200413/1568610660.pdf
  • 直接打开的链接

    1
    http://file.zhile88.com/file/LkHL6RvF4g5gD8I0_jianlitongguanbibei.pdf

大家都是 http 请求凭什么你比我优秀?
随后我分别 curl 了一下链接,分析了他们的区别

  • 直接下载的链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ curl -I http://qcloudoss.xunjiepdf.com/xunjiepdf/temp/20200413/1568610660.pdf

HTTP/1.1 200 OK
Server: TencentCOS
x-cos-storage-class: STANDARD
x-cos-hash-crc64ecma: 4085129986793626390
Content-Type: application/pdf
Content-Disposition: attachment; filename*="UTF-8''1568610660.pdf"
Content-Language: zh-CN
ETag: 617eabf18fced6cd1202b86f3e36656c
x-cos-object-type: normal
Accept-Ranges: bytes
Last-Modified: Mon, 13 Apr 2020 15:52:14 GMT
x-cos-request-type: head
Content-Length: 69626
  • 直接打开的链接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ curl -I http://file.zhile88.com/file/LkHL6RvF4g5gD8I0_jianlitongguanbibei.pdf 

HTTP/1.1 200 OK
Server: Tengine
Content-Type: application/pdf
Content-Length: 1440571
Connection: keep-alive
Date: Mon, 13 Apr 2020 06:57:25 GMT
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: X-Log, X-Reqid
Access-Control-Max-Age: 2592000
Cache-Control: public, max-age=36000000
Content-Disposition: inline; filename="LkHL6RvF4g5gD8I0_jianlitongguanbibei.pdf"; filename*=utf-8''LkHL6RvF4g5gD8I0_jianlitongguanbibei.pdf
Content-Md5: HhhEZRBLWCJLirG+yhSOeg==
Content-Transfer-Encoding: binary
Etag: "Fpv0_h7Y9qe4Plhlp-UcAwMtqumy"
Last-Modified: Mon, 13 Apr 2020 06:41:53 GMT
... 省略无关的header

头信息中 Content-Disposition 一下就吸引了我,一个是 inline,另一个是 attachment,根据 mozilla 官方文档我得到的信息如下:

在HTTP场景中,第一个参数或者是inline(默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示),或者是attachment(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将filename的值预填为下载后的文件名,假如它存在的话)。

看到这里一下就解决了我的问题,浏览器自创建之初到现在,陆陆续续也添加着许许多多的约定参数。七牛对于需要下载的文件添加一个参数配置即可,七牛真🐂。

参考文档

坚持原创技术分享,您的支持将鼓励我继续创作!