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

Pau*_*per 383 browser http download http-headers

HTTP标准说:

如果在带有application/octet-stream内容类型的响应中使用此标题[Content-Disposition:attachment],则隐含的建议是用户代理不应显示响应,而是直接输入`save response as .. '对话.

我读到了

Content-Type: application/octet-stream
Content-Disposition: attachment
Run Code Online (Sandbox Code Playgroud)

不过,我本来以为Content-Typeapplication/pdf,image/png等等.

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

Jon*_*nna 889

没有.

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

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

RFC 2616还提到了扩展令牌的可能性,而且现在大多数浏览器都认为inline你确实希望在可能的情况下显示实体(也就是说,如果它是浏览器知道如何显示的类型,那么它就没有选择了) .这当然是默认行为,但这意味着您可以包含filename标题的一部分,浏览器将使用(可能需要进行一些调整,以便文件扩展名与所讨论的内容类型的本地系统规范相匹配,可能不会)作为用户尝试保存的建议.

因此:

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="picture.png"
Run Code Online (Sandbox Code Playgroud)

意思是"我不知道这到底是什么.请把它保存为文件,最好是名为picture.png".

Content-Type: image/png
Content-Disposition: attachment; filename="picture.png"
Run Code Online (Sandbox Code Playgroud)

表示"这是PNG图像.请将其保存为文件,最好命名为picture.png".

Content-Type: image/png
Content-Disposition: inline; filename="picture.png"
Run Code Online (Sandbox Code Playgroud)

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

在那些识别出inline某些人总是会使用它的浏览器中,而其他人会在用户选择"保存链接为"时使用它,但如果他们在查看时选择"保存"则不会使用它(或者至少IE曾经是这样,它几年前可能已经改变了).

  • 这是一个很好的答案,如果事情像那样运作真的很好.但不幸的是,所有浏览器都被破坏了.例如,如果这是您对表单的回复,Google Chrome将无法为您打开"文件保存"窗口,无论是否包含"内容处置:附件",即使使用"application/octet-stream"作为内容类型.然后他们会打印一条消息,说你可能会受到攻击......没有办法让我保存文件.即使您只想保存文件,也必须配置xdg-open.我厌倦了这一点. (29认同)
  • @Wilt如果客户想要保存它,那么发送哪个标题无关紧要(你可以在浏览器中"保存"或"保存链接为"),因为标题是信息,而不是规则所以`附件`可以被认为是"最好不要自己展示",而"内联"则表示"如果可以,最好自己展示".无论哪种方式,大多数浏览器都会使用文件名值作为文件的建议名称,但用户始终可以覆盖它. (7认同)
  • 这是行不通的。我尝试将内容类型发送为“text/csv”和“application/octet-stream”,两者都带有“Content-Disposition:附件”;filename=<filename>` 但是当从 FE 调用此 api 时,这不起作用。该 API 是一种 POST API。浏览器在网络选项卡中显示正确的响应,但不提示下载,也不自动保存文件。 (3认同)
  • 我刚刚遇到了带有 BOM(字节顺序标记)的文本文件的问题。众所周知,要使 Excel 在 CSV 文件中显示国际符号,您必须将 CSV 编码为带有 BOM 的 UTF16 LE。因此,我将文件作为“text/csv”发送,但无法打开。事实证明,HTTP 客户端正在做一些额外的重新编码,并用垃圾替换 BOM。阻止它这样做的唯一方法是指定“binary/octet-stream”。我还没有尝试“application/octet-stream”,因为“binary”似乎更明确地说明了我想要实现的目标。 (2认同)
  • 在大多数情况下,事情都是这样的,但是,iOS13/iOS14 safari 仍然在当前选项卡上打开 pdf 文件(仅 PDF)。需要设置为 `octet-stream` 以便弹出下载窗口 (2认同)