HTTP标准说:

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

我把它理解为

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

但我认为内容类型应该是应用程序/pdf,图像/png等。

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


No.

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

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

RFC 2616 also mentions the possibility of extension tokens, and these days most browsers recognise inline to mean you do want the entity displayed if possible (that is, if it's a type the browser knows how to display, otherwise it's got no choice in the matter). This is of course the default behaviour anyway, but it means that you can include the filename part of the header, which browsers will use (perhaps with some adjustment so file-extensions match local system norms for the content-type in question, perhaps not) as the suggestion if the user tries to save.

因此:

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”。

在那些能识别内联的浏览器中,有些会一直使用它,而另一些则会在用户选择“保存链接为”时使用它,而不是在查看时选择“保存”(或者至少IE曾经是这样的,它可能在几年前已经改变了)。