填充服务器上的文件,但下载为空

时间:2014-01-08 16:50:57

标签: php

我有一个值数组,我想将其放入csv文件然后下载它:

$f = fopen("./tokens.csv", "w");
foreach ($tokens as $line) {
        fputcsv($f, array("1"=>$line));
}

fseek($f, 0);
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="tokens.csv"');
fpassthru($f);

结果是服务器上的文件填充了令牌数组的内容,但下载的文件是一个空的csv文件。

2 个答案:

答案 0 :(得分:3)

您已在“只写”模式下打开文件。您没有告诉PHP您想要阅读它。您需要以“读写”模式打开文件。

$f = fopen("./tokens.csv", "w+");

DOCS:http://www.php.net/manual/en/function.fopen.php

P.S。它是text/csv而不是application/csv。你拼错了attachment


注意:"w+"每次都会覆盖该文件。是否要将文件存储在服务器上,或者这只是一个下载脚本?如果你存储文件而你只是用它来下载文件,你可以直接写入输出流:

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="tokens.csv"');

$f = fopen("php://output", "w");
foreach ($tokens as $line) {
    fputcsv($f, array("1"=>$line));
}

答案 1 :(得分:1)

这将有效:

$f = fopen("./tokens.csv", "w+");
foreach ($tokens as $line) {
        fputcsv($f, array("1"=>$line));
}

fseek($f, 0);
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename="tokens.csv"');
fpassthru($f);

Attachment而非attachement
CSV文件的正确Mime类型是:
header('Content-Type: text/csv');