我目前正在开发一个使用Zend Framework的PHP项目。我在控制器中没有任何问题制作CSV,但是希望用户能够通过单击视图中的按钮来下载文件。
在.phtml
我有:
<a class="btn" href="<?php echo $this->download;?>" download>Export to CSV</a>
$this->download
正在控制器中设置:
$view["download"] = $this->_createCSV($bqc_jobs, $startDate, $endDate, $processor_id, $defaultTime);
_createCSV
函数创建CSV并将其存储在站点使用的临时目录中。然后它返回文件路径。
private function _createCSV($jobs, $start, $end, $user=null, $minutes){
$format = "Ymd_His";
if(!$start && !$user){
$start = date($format, strtoTime("-" . $minutes . " minutes"));
}
if(!$end){
$end = \DateTime::createFromFormat($format, date($format))->format($format);
}
$directory = Config::$tempDir;
$fileName = $directory . "/" . ($user ? $user . "_" : "") . ($start ? $start . "_" : "") . $end . "_report.csv";
$file = fopen($fileName, 'w');
foreach ($jobs as $job){
fputcsv($file, $job);
}
fclose($file);
return $fileName;
}
单击该按钮时,浏览器会尝试下载该文件,但由于无法找到该文件而导致错误。这是有道理的,因为浏览器不应该访问临时文件夹,但我不完全确定如何解决这个问题。
答案 0 :(得分:1)
如果由于UNIX文件权限而无法看到该文件夹,那么您唯一的选择就是:
一旦确定您的文件权限正常并且apache可以读取该文件,it appears that you should be able就可以使用php的readfile函数将文件实际传输回浏览器:
<?php
$file = '/tmp/monkey.gif';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
?>