我目前正在尝试在用户的浏览器中下载文件,但到目前为止还无法实现。
我已经在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
,而不向用户指示发生了任何事情。没有下载对话框,没有。
如果有人能够发现我的代码或我的流程存在问题,请指出并最好建议更好/另类的方法,此时欢迎任何帮助。
答案 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);
}
?>