HTTP标准说:


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


我读为

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


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

如果我想让浏览器下载文件?

#1 楼

否。

如果知道的话,内容类型应该是已知的。 application/octet-stream在RFC 2046中定义为“任意二进制数据”,在这里有一定的重叠之处,适用于其唯一预期目的是保存到磁盘,并且从此以后不在任何“ webby”之外的实体。或者从另一个方向看它;安全地使用application / octet-stream唯一可以做的就是将其保存到文件中,并希望其他人知道它的用途。如Content-Disposition或什至image/png,表示您要保存而不是显示。以前,有些浏览器会在text/html情况下忽略它,但是我认为这是很久以前的事情了(我很快就要入睡了,所以我不会开始测试一大堆东西)

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

因此:

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”。

在识别filename的浏览器中,有些会一直使用它,而如果用户选择了“另存为”,而另一些会在查看时(或在至少IE曾经是这样,它可能在几年前发生了变化。

评论


这是一个很好的答案,如果事情能那样做的话,那真的很好。但不幸的是,所有浏览器都已损坏。例如,如果这是您从表单中获得的答复,则Google Chrome将不会为您打开“文件保存”窗口,即使包括“ application-octet-stream”作为内容类型,无论是否包含“ Content-Disposition:附件” 。然后他们会打印一条消息,说您可能正在受到攻击...根本没有办法让我保存文件。即使您只想保存文件,也必须配置xdg-open。我对此感到厌烦。

–除以零
2015年4月4日在17:44

@dividebyzero不是我遇到的问题,包括Chrome。您的工作还有其他异常之处吗?

–琼·汉娜(Jon Hanna)
15年4月4日在17:50

上载具有默认enctype的文件将是不正确的,并且可能是这样的结果触发了一些攻击检测,而不仅仅是使文件内容可用。

–琼·汉娜(Jon Hanna)
15年4月4日在18:22

@Wilt如果客户端要保存它,那么发送什么标题都没有关系(您可以在浏览器中的任何内容上“保存”或“将链接另存为”),因为标题是信息,而不是规则,因此附件可以被认为是“最好不要自己显示此信息”,而内联则应被视为“如果可能的话最好自己显示此信息”。无论哪种方式,大多数浏览器都将使用文件名值作为建议的文件名,但用户始终可以覆盖该文件名。

–琼·汉娜(Jon Hanna)
2015年4月9日在14:12

@Tresdin谢谢。我有点不高兴,它相对于我认为更好的其他应用程序如此受欢迎,但我想它一定已经解决了人们的问题。

–琼·汉娜(Jon Hanna)
15年7月18日在8:39