我是否需要Content-Type: application/octet-stream来下载文件?

HTTP标准表示:

如果响应中使用了这个报头[Content-Disposition: attachment] 使用application/octet-stream内容类型,隐含的 建议用户代理不显示响应,但是 直接输入“save response as…””对话框。< / p >

我把它理解为

Content-Type: application/octet-stream
Content-Disposition: attachment

但是我认为Content-Type应该是application/pdfimage/png等等。

如果我想让浏览器下载文件,我应该使用Content-Type: application/octet-stream吗?

821663 次浏览

不。

内容类型应该是已知的任何类型(如果您知道的话)。application/octet-stream在RFC 2046中被定义为“任意二进制数据”,这里有一个明确的重叠,它适用于那些唯一的目的是保存到磁盘上的实体,从这一点开始,它就在任何“webby”之外。或者从另一个方向看;唯一可以安全地使用application/octet-stream的事情是将其保存到文件中,并希望其他人知道它的用途。

您可以将Content-Disposition与其他内容类型结合使用,例如image/png或甚至text/html表示您希望保存而不是显示。在text/html的情况下,一些浏览器过去会忽略它,但我认为这是很久以前的事情了(我很快就要睡觉了,所以我现在不打算开始测试一大堆浏览器;也许以后)。

RFC 2616还提到了扩展令牌的可能性,现在大多数浏览器都认为inline意味着您确实希望尽可能地显示实体(也就是说,如果它是浏览器知道如何显示的类型,否则它在这件事上没有选择)。这当然是默认的行为,但这意味着你可以包括头文件的filename部分,当用户试图保存时,浏览器将使用它作为建议(可能会进行一些调整,以便文件扩展名与相关内容类型的本地系统规范相匹配,也可能不是)。

因此:

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="picture.png"

意思是"我不知道这是什么鬼东西。请将其保存为文件,最好命名为picture.png”。

Content-Type: image/png
Content-Disposition: attachment; filename="picture.png"

表示“这是一个PNG图像。请将其保存为文件,最好命名为picture.png”。

Content-Type: image/png
Content-Disposition: inline; filename="picture.png"

表示“这是一个PNG图像。请显示它,除非你不知道如何显示PNG图像。否则,或者如果用户选择保存它,我们建议您将文件保存为“picture.png”。

在那些能够识别inline的浏览器中,有些会一直使用它,而如果用户选择了“另存链接为”,其他人则会使用它,但如果他们在查看时选择了“保存”,则不会使用它(或者至少IE曾经是这样的,它可能在几年前发生了变化)。