从PHP项目的tmp文件夹下载CSV

时间:2016-06-14 15:04:30

标签: php csv zend-framework download

我目前正在开发一个使用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; 
}

单击该按钮时,浏览器会尝试下载该文件,但由于无法找到该文件而导致错误。这是有道理的,因为浏览器不应该访问临时文件夹,但我不完全确定如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

如果由于UNIX文件权限而无法看到该文件夹​​,那么您唯一的选择就是:

  1. 更改tmp文件夹上的文件权限,以便您的Web服务器可以使用chmod / chown进行读/写(我假设它是一个Linux系统?)
  2. 使用具有足够权限的其他文件夹
  3. 不要将文件存储在磁盘上 - 而是将其存储在数据库中(不是最佳的)。
  4. 一旦确定您的文件权限正常并且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;
    }
    ?>