当响应是附件时,Content-Type header 有什么用?

What's the use of Content-Type header when the response is an attachment?

如果响应 header 包含 Content-Disposition: attachment; filename=image.gif,则浏览器将自动保存数据。在这种情况下传递 Content-Type header 有意义吗?

是的,如果您知道适当的 Content-Type header 是什么,这确实有意义,但是 没有明确要求。

RFC6266 Use of the Content-Disposition Header Field in HTTP
According to the original RFC 2616, the disposition type "attachment" only applies to content of type "application/octet-stream". But this restriction has been removed, because recipients in practice do not always check the content type, and it also discourages properly declaring the media type.

So traditionally, we used to have to always specify Content-Type:application/octet-stream to force a download, over time clients evolved and started ignoring it altogether if there was a disposition header header.

Content-Type 告诉浏览器如何解释响应,但 Content-Disposition: attachment 告诉浏览器将响应视为文件,而不是尝试呈现它。

但并非所有 客户端都是网络浏览器,而且并非所有网络浏览器都是平等的。通过提供 Content-Type 以及您提供的附加信息,客户上下文可以选择使用这些信息,或者如果由于某种原因客户不理解或不尊重配置 [=50],它将作为默认值=],或其值。

By specifying the Content-Type many browsers will use this information to determine the file type restriction to apply on the Save As dialog, which is especially useful if you are NOT also specifying the file name.

一些现代网络客户端(及其扩展程序)将检查 Content-Type 并选择故意将内容传递给为该类型注册的应用程序或扩展程序,而不是总是直接保存到文件中,即使Content-Disposition 是附件。您可能在使用 PDF 查看器时遇到过这种情况。

还有许多较旧的移动网络客户端和 mini-web 嵌入移动应用程序中的浏览器 支持Content-Disposition 或者他们故意绕过它,而不是强制直接呈现内容,因此通过在可能的时候提供 Content-Type 然后你知道你正在提供你合理可以提供的最兼容的输出。

关于 SO 也有类似的讨论,但不是直接重复,因为这个问题问我们为什么要包含它 Content-Type 知道它不太可能被使用。