强制PHP通过浏览器下载文件

时间:2017-06-14 22:14:36

标签: php file download header

我目前正在尝试在用户的浏览器中下载文件,但到目前为止还无法实现。

我已经在stackoverflow.com上查看了其他答案,到目前为止还没有找到解决我问题的任何问题。

我的流程如下:

我创建文件名和文件路径,然后设置标题:

$date = new DateTime();
$currentDateTime = $date->format("Y-m-d H:i:s");
$filename = "{$name}_{$currentDateTime}.csv";
$filepath = $rootfull . "/{$filename}";

// Set headers
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="' . $filepath . '"');
header('Content-Length: ' . filesize($filepath)); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');

然后我创建文件并开始写入它:

// Write header
fputcsv($output, $header);
fputcsv($output, array()); // Empty line

// Write column names
$column_headers = array_keys(array_flip($columns));

foreach ($data as $row)
{
    fputcsv($output, $row);
}

echo readfile($filepath);
die();

生成文件并将其写入指定位置(在本例中为/var/www/<project>/<filename>.csv,而不向用户指示发生了任何事情。没有下载对话框,没有。

如果有人能够发现我的代码或我的流程存在问题,请指出并最好建议更好/另类的方法,此时欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

如果写入磁盘没有任何好处(糟糕的mans缓存),那么可能就像写缓冲区一样:

<?php

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="dump_' . date('Ymd') . '.csv"');
header("Pragma: no-cache");
header("Expires: 0");
$this->outputCSV($results);
exit(); //->

public function outputCSV($data, $useKeysForHeaderRow = true)
{
    if ($useKeysForHeaderRow) {
        array_unshift($data, array_keys(reset($data)));
    }
    $outputBuffer = fopen("php://output", 'w');
    foreach($data as $v) {
        fputcsv($outputBuffer, $v);
    }
    fclose($outputBuffer);
}
?>