【问题标题】:Chrome opening CSV file instead of save itChrome 打开 CSV 文件而不是保存它
【发布时间】:2026-02-16 04:05:01
【问题描述】:

我有一个 PHP 应用程序,它生成一个 CSV 文件并将用户重定向到一个链接到该文件的静态页面,就像下面的示例:

https://www.example.com/public_html/static/temp/myfile.csv

问题是,Chrome 正在打开文件而不是保存它。我需要 Chrome 来保存这个文件,就像它处理任何其他文件一样,例如 zip 或 mp3。

这是我尝试过的:

header('location:https://www.example.com/public_html/static/temp/myfile.csv');    
header('Content-Disposition: attachment; filename=myfile.csv'); 

但不走运,Chrome 一直显示 myfile.csv 内容而不是下载它。

有什么想法吗?

谢谢

【问题讨论】:

  • Content-Disposition在这个请求处理中在这里没有任何意义,它应该在下一个对/public_html/static/temp/myfile.csv的请求的响应头中确保第二个请求的响应头中有'Content-Disposition: attachment;
  • 这在约定和逻辑上都是错误的:HTTP 标头应该有正确的大小写和冒号后的空格。并且调用https://domain/file.csv 将无处执行您的PHP 代码。最重要的是:重定向 HTTP 请求(通过Location:)让客户端请求新的 URI,而不是向服务器传递目标的内容。解决方案:提供一个输出 CSV 的 PHP 文件。
  • @AmigoJack 当我重定向到 CSV 文件时,PHP 代码已经执行完毕,可以下载文件了
  • @Accountantم 我没有真正理解这个想法,你能解释更多吗?
  • @delphirules 如果对/public_html/static/temp/myfile.csv 的请求在响应标头中有Content-Disposition: attachment;,Chrome 将下载文件而不是打开它,请确保响应具有来自chrome 网络选项卡中的此标头开发者工具。

标签: php google-chrome


【解决方案1】:

您在 cmets 中的论点有一个永无止境的误解:Location 标头指示任何客户端对给定 URI 执行新请求。这样,当前的请求就结束了。当前请求的标头(即Content-Disposition)不会神奇地转移到下一个请求。

换句话说:你的“静态页面链接到文件,只是下面的例子”必须发送你想要的标题。

最终我确定这也不是 Chrome 问题,而是影响所有互联网浏览器,因为它们很容易将 CSV 数据检测为文本,因此能够呈现/显示该数据,而不仅仅是能够将其保存到文件。

【讨论】:

    【解决方案2】:

    使用 html5,您可以在元素中设置“下载”属性。

    下载吧! 来源:http://updates.html5rocks.com/2011/08/Downloading-resources-in-HTML5-a-download

    【讨论】:

    【解决方案3】:

    在为这个问题苦苦挣扎了几天之后,我得到的唯一真正的解决方案是压缩文件,然后重定向到 ZIP 文件而不是 CSV。通过这样做,Chrome 将下载 ZIP 文件而不是打开它:

    header('location:https://www.example.com/public_html/static/temp/myfile.csv.zip');    
    

    【讨论】:

    • 这是一种解决方法,而不是解决方案。而且你写错了标题指令。
    最近更新 更多