http - 我需要 Content-Type : application/octet-stream for file download? 吗

标签 http browser http-headers download

HTTP standard说:

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.

我是这样读的

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

但我本以为Content-Type会是application/pdf, image/png

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

最佳答案

没有。

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

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

RFC 2616 也提到了扩展 token 的可能性,如今大多数浏览器都将 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 曾经是这样,它可能在几年前已经改变了)。

关于http - 我需要 Content-Type : application/octet-stream for file download? 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508788/

相关文章:

html - 如何避免全屏背景图像随出现的滚动条一起缩放?

reactjs - 如何正确设置axios默认标题

Perl 错误 : X-Died: Missing newline after chunk data:

java - 使用 selenium 无法访问 org.openqa.selenium.webdriver 错误?

Android:在浏览器中编辑文本行为

c# - 从对 HttpWebRequest 的调用中复制 HTTP 请求/响应 header ?

jquery - AJAX(或 AJAX-esque)文件下载

java - Jersey REST - 将 MultivaluedMap 发送到 GET 会导致不支持的媒体类型

c# - 如何等待服务器成功响应 HTTP 请求

android - 内容长度 > 0 但正文为空的 HTTPS 请求