关于http:我是否需要Content-Type:application / octet-stream进行文件下载?

Do I need Content-Type: application/octet-stream for file download?

HTTP标准规定:

If this header [Content-Disposition: attachment] is used in a response
with the application/octet-stream content-type, the implied
suggestion is that the user agent should not display the response, but
directly enter a `save response as...' dialog.

我读到

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

但我本以为Content-Typeapplication/pdfimage/png等。

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


不。

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

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

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

因此:

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

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

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

意思是"这是一个PNG图像。请将其保存为文件,最好命名为picture.png"。

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

意思是"这是一个PNG图像。请显示它,除非您不知道如何显示PNG图像。否则,或者如果用户选择保存它,我们建议将其另存为的文件命名为picture.png"。

在那些识别inline的浏览器中,有些总是使用它,而另一些则使用它,如果用户选择了"保存链接为",但如果用户在查看时选择了"保存"(或者至少IE以前是这样的,几年前它可能已经改变了)。