【问题标题】:What determines whether a browser will open or download a .txt file?是什么决定了浏览器是否会打开或下载 .txt 文件?
【发布时间】:2013-10-15 23:21:50
【问题描述】:

首先让我说,我知道您可以在标题中指定 Content-Disposition 并使用“附件”或“内联”,而这个问题不是(至少不直接)。

我有一个扩展名为 .txt 的文件。我注意到不同的浏览器行为取决于该 .txt 文件的内容。如果我的文件包含字母数字字符,并且我将文件的位置粘贴到(比如说)Chrome 的 URL 栏中,则该文件会在浏览器中打开。

如果我的文件包含"SI" 字符,则下载文件而不是在浏览器中打开。

起初我以为可能是因为“SI”是控制代码,但“CR”和“LF”也是控制代码,当它们存在时文件会显示在浏览器中。当 .txt 文件中存在“DC2”字符时,该文件甚至会在 Chrome 中打开。

我的问题是:在文件内容层面,是什么决定了文件是否显示或下载?

(我意识到这可能因浏览器而异,但如果有一些至少有点可靠的东西,知道会有所帮助)

提前致谢。

编辑(基于 Sam 的回答):

当“SI”或“DC2”字符在文本文件的前 1000 个左右字符中时,它将被下载,如果这些字符在前 1000 个左右字符之后,则文件将显示在浏览器中。

【问题讨论】:

    标签: file browser download rendering ascii


    【解决方案1】:

    当您向浏览器发送文件时,浏览器的行为将基于您的服务器发送的内容类型标头。如果您自己没有明确设置它,您的 Web 服务器可能会尝试根据文件的前几个字节做出最佳猜测。

    http://httpd.apache.org/docs/2.2/mod/mod_mime_magic.html

    【讨论】:

    • 这让我开始玩弄我正在使用的文件,并发现文件中“特殊”字符的位置确实很重要。谢谢
    【解决方案2】:

    如果浏览器显示保存对话框,则确定顺序。

    • Content-Disposition 由 Web 开发人员在 Apache 或 cgi 中设置。根据规范,这是我们应该做的。
    • Content-Type 标头的 MIME type 由 Web 开发人员在 Apache 或 cgi 中设置

    application/octet-stream ... browsers ... 将其视为设置了 Content-Disposition 标头 到附件,并提出一个“另存为”对话框。

    • Content-Type 标头的 MIME 类型由 Web 服务器确定和设置。例如Apache有两种方法:

      • Apache 的assign MIME type 通过在 URI 或文件名中映射模式。例如AddType application/octet-stream .pkg
      • Apache 的 mod_mime_magic如果它已由网络开发人员安装并启用

      ... 只有当魔术文件由 MimeMagicFile 指令。

    • HTML5 download attribute 由 web 开发人员在 html 文件或 JS 中设置(我没有测试它是否不会覆盖上述内容)

    如果以上都不适用,则浏览器超出规范并自行决定。

    在以下屏幕截图中,响应标头未提及 Content-Disposition,也未提及 Content-Type。在左侧,我们可以看到文件的一部分被传输(我没有点击打开或保存),我们可以看到浏览器声明它是“application/octed-stream”

    我的假设是,浏览器在接收到文件的一部分后认为内联(在屏幕上)显示它是不明智的,声明 MIME 并提供保存对话框。

    截图是我在 Omnibox 中粘贴文件的 URL,打开 DevTools 并在 Omnibox 中按 Enter 键“转到”粘贴的地址后,从 Firefox 的开发者工具制作的。

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 2019-03-08
      • 1970-01-01
      • 2011-11-08
      • 2013-05-15
      • 2013-04-13
      • 1970-01-01
      • 2013-10-25
      • 2011-06-19
      相关资源
      最近更新 更多