web开发中,如何让浏览器下载文件?

栏目: 后端 · 前端 · 发布时间: 7年前

上个星期,一个对外的项目遇到浏览器下载附件错误的问题,简单的研究了下,涉及了二个问题:一个是通过编程如何让浏览器支持文件下载,第二个问题是如果附件是中文名称,如何避免文件出现乱码,这篇文章主要讲解文件下载的原理。

从本质上讲,为了支持文件下载,客户端(浏览器)和服务器支持 特定的HTTP头 即可,但不是所有的客户端(浏览器)都按照 标准 处理,比如说iPhone就无法通过浏览器下载文件。

rfc7231 中(HTTP/1.1 子协议 Semantics and Content)中已经说明 Content-Disposition 头并不是 HTTP 协议中的标准头,但 Content-Disposition 头在 HTTP 应用中有一定的应用场景,所以 rfc6266 详细描述了这个头部在 HTTP 中的使用标准,确切的说在 HTTP 应用中,这个头部称为 response header。

那么是否意味着 Content-Disposition 这个头部还有其他用途?是的,最早这个头在邮件应用中使用的比较多,属于 MIME 的一部分,Content-Disposition header(不是 response header)定义在 rfc2183 上,我在写《你真的知道网页上传文件背后的原理吗?》文章时,对于 MIME 中如何使用 Content-Disposition 有所涉及。

我参考 CodeIgniter PHP 框架,研究了文件下载的原理,实际上就是输出一些 HTTP 头部,如下图:

大部分头部在常规的 HTTP 应用中(比如页面和接口)很常见,比如 Content-Length 表示附件的大小(在 PHP 中使用 strlen()算对吗?);Cache-Control和Expires控制缓存头,对于下载附件来说,就是强制获取最新内容;Content-Type表示附件的类型,不过如果你统一使用 application/octet-stream 也没有问题,浏览器照样能够下载;application/octet-stream 头部代表未知的应用(二进制文件)。

Content-Transfer-Encoding 这个头部是第一次看见,它和 Content-Type 头部有点类似,但主要用于传输。它在 multipart MIME 类型中用的比较多(如果一个实体是 multipart 类型,那么 Content-Transfer-Encoding 的值只能是 "7bit"、"8bit"、"binary"中的一个),对应到文件下载,这个值设置为 binary,表示允许非ASCII码进行传输。可以认为 application/octet-stream 等同于 Content-Transfer-Encoding:binary 。关于这个头部,理解的不是很好,可以参考 rfc2045 (内容实在太多了)。

对于文件下载,最重要的HTTP头部就是 Content-Disposition,它用来表示内容如何在浏览器中显示:可以是内联(inline)呈现(对应的内容将作为页面的一部分呈现)或者附件下载(attachment)的形式。其中 filename 参数表示附件的名称,如果是中文,在不同的浏览器可能会出现乱码(这个我下一篇会简单说一说)。

本质上附件下载就是这么简单,但在 RFC 中没有清晰的看到实现附件下载的说明。


以上所述就是小编给大家介绍的《web开发中,如何让浏览器下载文件?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图说区块链

图说区块链

徐明星、田颖、李霁月 / 中信出版社 / 2017-7-1 / 59.00元

区块链,如瑞士仪表般精密,如互联网般惊世骇俗,它在以神一般的节奏颠覆社会。 当新兴技术来临时,你可以选择规避——如果明天也可以规避的话。区块链也一样。 作为一个现象级概念,金融科技创新在过去几年迎来了奇点式发展。其中最引人注目的当属区块链技术。区块链技术正在动摇全球金融基础设施,它是全球顶级银行和其他金融机构重点追逐的领域。毫无疑问,区块链是未来5年最有前景的行业之一。 《图说区......一起来看看 《图说区块链》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具