ChatGPT解决这个技术问题 Extra ChatGPT

我需要 Content-Type: application/octet-stream 来下载文件吗?

HTTP standard 说:

如果此标头 [Content-Disposition: attachment] 用于内容类型为 application/octet-stream 的响应中,则暗示用户代理不应显示响应,而应直接输入 `save response as.. .' 对话框。

我读为

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

但我原以为 Content-Type 会是 application/pdfimage/png 等。

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


J
Jon Hanna

不。

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

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

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

因此:

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

意思是“我不知道这到底是什么。请将其保存为文件,最好命名为图片.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 曾经像那个,它可能在几年前已经改变了)。


使用默认 enctype 上传文件是不正确的,并且可能会触发一些攻击检测,而不是仅仅下降以使文件内容可用。
@Wilt 如果客户端想要保存它,那么发送什么标头都没有关系(您可以在浏览器中的任何内容上“保存”或“将链接另存为”),因为标头是信息,而不是规则,所以 {1 } 可以被认为是“最好不要自己显示”,而 inline 可以被认为是“如果可以的话最好自己显示”。无论哪种方式,大多数浏览器都会使用文件名值作为文件的建议名称,但用户始终可以覆盖它。
@JonHanna 对我来说,这仅仅是因为三点。其他一些答案建议使用 non-senseapplication/octet-stream Content-Type 下载文件。你没有。他们还建议将 attachment 设置为 Content-Disposition。你没有。你的解释让我感到清晰和舒服。他们的没有。
我刚刚遇到了具有 BOM(字节顺序标记)的文本文件的问题。众所周知,要让 Excel 在 CSV 文件中显示国际符号,您必须使用 BOM 将 CSV 编码为 UTF16 LE。因此,我将文件作为 text/csv 发送,但无法打开。事实证明,HTTP 客户端正在做一些额外的重新编码并用垃圾替换 BOM。阻止它这样做的唯一方法是指定 binary/octet-stream。我还没有尝试 application/octet-stream,因为 binary 似乎更明确地说明了我想要实现的目标。
在大多数情况下,事情都是这样工作的,但是,iOS13/iOS14 Safari 仍然在当前选项卡上打开 pdf 文件(仅 PDF)。需要设置为 octet-stream 以便弹出下载窗口