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

时间:2013-12-11 01:24:19

标签: http browser http-headers download

HTTP standard说:

  

如果在回复中使用此标题[Content-Disposition:attachment]   与application / octet-stream内容类型一起暗示   建议是用户代理不应该显示响应,但是   直接输入“保存响应为...”对话框。

我将其视为

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

但我认为Content-Typeapplication/pdfimage/png等。

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

1 个答案:

答案 0 :(得分:817)

没有

如果您知道,内容类型应该是已知的内容类型。 {20}中的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曾经是这样的,几年前它可能已经改变了。)