Do I need Content-Type: application/octet-stream for file download?
HTTP标准规定:
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.
我读到
1 2
| 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"之外。或者从另一个方向来观察它;对于应用程序/octet流,唯一可以安全地做的就是将其保存到文件中,并希望其他人知道它的用途。
您可以将Content-Disposition的使用与其他内容类型(如image/png或甚至text/html相结合,以表示您希望保存而不是显示。以前有些浏览器会忽略它,比如text/html,但我认为这是很久以前的事了(我很快就要睡觉了,所以我现在不打算测试一大堆浏览器,也许以后)。
RFC2616还提到了扩展令牌的可能性,现在大多数浏览器都认识到inline,这意味着您希望尽可能显示实体(也就是说,如果它是浏览器知道如何显示的类型,否则它在这件事上没有选择)。当然,这是默认行为,但这意味着您可以在标题中包含filename部分,如果用户试图保存,浏览器将使用该部分作为建议(可能进行了一些调整,以便文件扩展名与相关内容类型的本地系统规范相匹配,也可能不匹配)。
因此:
1 2
| Content-Type: application/octet-stream
Content-Disposition: attachment; filename="picture.png" |
意思是"我不知道这是什么鬼东西。请将其保存为文件,最好命名为picture.png"。
1 2
| Content-Type: image/png
Content-Disposition: attachment; filename="picture.png" |
意思是"这是一个PNG图像。请将其保存为文件,最好命名为picture.png"。
1 2
| Content-Type: image/png
Content-Disposition: inline; filename="picture.png" |
意思是"这是一个PNG图像。请显示它,除非您不知道如何显示PNG图像。否则,或者如果用户选择保存它,我们建议将其另存为的文件命名为picture.png"。
在那些识别inline的浏览器中,有些总是使用它,而另一些则使用它,如果用户选择了"保存链接为",但如果用户在查看时选择了"保存"(或者至少IE以前是这样的,几年前它可能已经改变了)。
- 这一切都有意义,但对我来说,如果内容是文本/HTML浏览器,则返回404。使用此标题:content disposition attachment;filename="jusp_2.html"内容类型text/html;charset=utf-8
- @詹尼斯,听起来你有问题,而不是评论,但你确切的意思是"浏览器返回404"。你在使用什么服务器技术?如果你用小提琴之类的东西偷听连接,你会看到什么?
- 这是一个很好的答案,如果事情能像这样运作的话,那就太好了。但不幸的是,所有的浏览器大多都坏了。例如,Google Chrome不会为您打开一个"文件保存"窗口,如果这是您对表单的响应,而不管是否包括"内容处置:附件",即使"application/octet-stream"是内容类型。然后他们打印了一条信息说你可能受到攻击…我无法保存文件。即使您只想保存一个文件,也必须配置xdg open。我受够了。
- @DivideByZero是我从来没有遇到过的问题,包括铬合金。你在做什么有什么不寻常的事吗?
- 好的,显然我的问题是我的HTML表单缺少enctype="multipart/form-data"(我正在上传一个电子表格并下载一个新的)。这对我的反应有何影响?我不知道这是如何改变整个过程的。它和curl和dhc很好地配合…
- 上传一个默认enctype的文件是不正确的,这可能导致了一些攻击检测,而不仅仅是为了让文件内容可用。
- 您能否详细介绍下面的第二个示例:如果客户机/用户希望保存它,但浏览器能够查看它,该怎么办?所以我想发送一个请求到一个图像,我想保存而不是显示在浏览器中…?在这种情况下,如何处理请求/响应对象/头?
- @Wilt如果客户想要保存它,那么发送什么头并不重要(您可以在浏览器中的任何内容上"保存"或"将链接另存为"),因为头是信息,而不是规则,因此attachment可以被视为"最好不要自己显示这个",而inline可以被视为"最好自己显示这个"。不管怎样,大多数浏览器都会使用文件名值作为文件的建议名称,但用户总是可以覆盖它。
- @特雷斯汀,谢谢。我有点不知所措,因为它如此受欢迎,相对于我的其他一些人,我认为它会更好,但我想它一定是在回答人们的问题。
- @乔汉娜对我来说,这仅仅是因为三分。其他一些答案建议使用无意义或application/octet-streamContent-Type下载文件。你没有。他们还建议把attachment设置为Content-Disposition。你没有。你的解释让我感觉清楚和舒服。他们没有。
- 我笑了,然后投赞成票,意思是"我不知道这是什么鬼东西。请将其保存为文件,最好命名为picture.png"。哦,还有因为答案很有帮助。
- Chrome仍将打开PDF而不是下载它。哈
- 如果Chrome打开PDF而不是下载它,是因为Chrome被设置为显示PDF文件的默认应用程序吗?