Apache设置和PHP标头(下载csv)

时间:2013-12-09 14:11:22

标签: php apache csv header

我正在尝试使用PHP标头创建.csv报告。我正在使用的标题是:

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=certificates.csv");
header("Pragma: no-cache");
header("Expires: 0");

最初,代码输出了.xls文件,但它本质上是html输出。我没有写这个原始代码所以我所做的就是改变输出和上面的第二个标题。出于某种原因,这在我的登台服务器上工作正常,但在生产服务器上没有。权限是相同的,所以我想也许它与Apache设置有关。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

执行此操作的正确方法如下:

在你的.htaccess文件或主服务器配置文件的适当位置添加一个'AddType'行(我不能确切地说我在哪里,因为我不知道你的Apache正在运行什么发行版)

AddType application/octet-stream csv

然后使用以下PHP代码段来提供您的文件

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');
readfile("name and path of CSV file you wish to send");

或者使用PHP发送CSV行而不是使用ReadFile从磁盘生成它。确保你也使用正确的行终止符'\ n'在每一行的末尾应该为你可能需要的Internet Explorer目标做好工作'\ r \ n'

您还需要发送

header("Content-Length: xxxx");

上面的'xxxx'应该用CSV内容的大小替换,如果你没有提供内容长度,那么服务器有可能不知道何时关闭连接并发出下载信号已完成(实际上非​​常罕见,但可能会发生)

如果您在发送之前在服务器磁盘上创建文件,那么获取正确的长度非常容易。

header("Content-Length: " . filesize("path and file name of csv to send"));

在一天结束时,这不是一个精确的科学,虽然你可以做很多事情来强制浏览器下载你的文件,如果用户已经配置他们的浏览器做一些完全不同的东西那么那就是什么无论你采取什么步骤都会发生。

如果您希望将mime类型添加到apache配置以支持此类方案,那么需要查找Apache“AddType”关键字:

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

如果你要使用AddType,你需要确保你的Apache服务器上也安装了'mod_mime',一般来说这是默认设置之一,所以默认情况下应该这样。

答案 1 :(得分:1)

好吧,你没有使用正确的内容类型标题,应该是:

header('Content-type: text/csv');