如何设置响应文件名而不强制出现“另存为”对话框

144

我在某个响应中设置了适当的content-type标头并返回一个流。 我想要的行为是:

  • 如果浏览器能够呈现给定内容类型的内容,则应在浏览器窗口中显示它。

  • 如果浏览器不知道如何呈现内容,则应该显示“另存为”对话框,其中文件名应该是响应中提供的文件名。

问题在于,如果我使用以下Content-Disposition标头:

"attachment; filename="myfile.txt""

浏览器将始终显示“另存为”对话框。

如果我不设置Content-Disposition,则“另存为”对话框中使用的文件名是URL中的文件名,这在我的情况下无法正常工作。

我还尝试将Content-Disposition设置为inline,但结果相同。

2个回答

201
正确的方式可能是:

内容分发: 内嵌; 文件名="myfile.txt"


9
当您撰写这个答案时,我不确定“不受广泛支持”的含义,希望您提供硬性事实,而不是散布恐惧的言论。 我刚在IE 6、IE 8、现代Chrome和现代Firefox上进行了测试,发现在所有浏览器中都可以正常使用;据我所知,现在使用它是完全安全的。 - Mark Amery
不支持我的 FireFox 37.0.2 和 Internet Explorer 11.0.18。我看到了一个“另存为”对话框。但是 Chrome 可以正常工作。 - angularsen
3
实际上,在 Firefox 37.0.2 和 IE 11.0.18 中都可以正常工作(已测试)。您可能正在使用一种浏览器无法内联显示的 Content-Type。 - Patonza
2
一些注意事项也在https://dev59.com/SXVD5IYBdhLWcg3wGHeu上进行了讨论 - 如果您的文件名中有空格,则需要在文件名周围加上双引号(")。如果您的文件名中有非ASCII字符,则应查看其他问题以了解该怎么处理。 - Christopher Schultz
在IE11.0.96中无法使用PDF,这并不奇怪,Chrome可以正常工作。 - user1566694

2

我不确定是否默认情况下可以实现。由于安全问题,浏览器不会发送它们可以处理的所有内容类型,而只发送一些Accept-Encoding,这在您的情况下并没有什么帮助。

也许你可以问问用户他们的偏好,并将该信息存储在他们的个人资料中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接