【问题标题】:Do I need Content-Type: application/octet-stream for file download?我需要 Content-Type: application/octet-stream 来下载文件吗?
【发布时间】:2013-12-28 19:33:47
【问题描述】:

HTTP standard 说:

如果在响应中使用此标头 [Content-Disposition: attachment] 使用 application/octet-stream 内容类型,隐含的 建议是用户代理不应该显示响应,但是 直接输入“将响应另存为...”对话框。

我是这样理解的

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

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

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

【问题讨论】:

    标签: http browser http-headers download


    【解决方案1】:

    没有。

    内容类型应该是已知的任何内容,如果您知道的话。 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"
    

    意思是“我不知道这是什么鬼。请将它保存为文件,最好命名为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像那样,它可能在几年前就改变了)。

    【讨论】:

    • 使用默认 enctype 上传文件是不正确的,这可能会触发一些攻击检测,而不仅仅是为了使文件内容可用。
    • @Wilt 如果客户端想要保存它,那么发送什么标头并不重要(您可以在浏览器中的任何内容上“保存”或“将链接另存为”),作为标头是信息,而不是规则,所以 attachment 可以被认为是“最好不要自己显示”,而 inline 是“如果可以的话,最好自己显示”。无论哪种方式,大多数浏览器都会使用文件名值作为文件的建议名称,但用户始终可以覆盖它。
    • @JonHanna 对我来说,这仅仅是因为三点。其他一些答案建议使用 non-senseapplication/octet-stream Content-Type 下载文件。你没有。他们还建议将attachment 设置为Content-Disposition。你没有。你的解释让我感到清晰和舒服。他们没有。
    • 如果 Chrome 是打开 PDF 而不是下载它,是不是因为 Chrome 被设置为显示 PDF 文件的默认应用程序?
    • 在大多数情况下,事情都是这样工作的,但是,iOS13/iOS14 safari 仍然在当前选项卡上打开 pdf 文件(仅 PDF)。需要设置为octet-stream,这样才能弹出下载窗口
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2012-09-11
    • 2010-12-28
    • 2011-04-22
    • 2011-11-21
    • 2012-05-07
    • 2011-01-26
    相关资源
    最近更新 更多