使用php强制下载.csv

时间:2014-07-02 23:57:48

标签: php csv

我试图让我的网页获取存储在服务器上的.csv文件并强制下载它。我已经尝试了几种不同的方法来实现这一点,并且遇到了这样的问题:当它以chrome格式保存时,它会毫无问题地下载.csv但在safari中会打开文件而不是保存它。

我尝试根据我之前看到的答案

这样做
header('Content-Type: application/csv');
header("Content-disposition: attachment; filename='".$username.'-LMSearch'.'.csv'."'");        

readfile($filename);

但是我没有发生任何事情,到目前为止我刚刚将页面重定向到文件位置。关于我哪里出错或为什么下载没有开始的任何建议?

编辑:

所以我尝试了发布的解决方案以及与之相关的问题,但问题仍然存在......

也许我可以用更多代码更详细地解释......

因此按下了一个保存数据按钮,然后从MySQL数据库中提取数据并使用PHPExcel将其制作成文件夹中的.csv。我知道这是正常的,因为该文件存在。

    $objPHPExcel = new PHPExcel();

    $objPHPExcel->setActiveSheetIndex(0);

    // Add some data
    for ($i = 0;$i < count($dataArray);$i++){
        for ($j = 0;$j < count($dataArray[$i]);$j++){
            $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($j, $i+1)->getNumberFormat()->setFormatCode('0.0000');
            $objPHPExcel->setActiveSheetIndex(0)->setCellValueByColumnAndRow($j, $i+1, $dataArray[$i][$j]);
            $objPHPExcel->getActiveSheet()->getColumnDimension(chr($j+65))->setAutoSize(true);
        }
    }

    $filePath = '../downloadFiles/'.$username;

    if (!file_exists($filePath)){mkdir($filePath,0700);}
    $filename = $filePath.'/'.$username.'-LMSearch-'.time().'.csv';

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV')->setDelimiter(',')
                                                                      ->setEnclosure('"')
                                                                      ->setLineEnding("\r\n")
                                                                      ->setSheetIndex(0)
                                                                      ->save($filename);
    $callEndTime = microtime(true);
    $callTime = $callEndTime - $callStartTime;


    header('Content-Description: File Transfer');
    header('Content-Disposition: attachment; filename="'.$username.'-LMSearch-'.time().'.csv'.'"');
    header('Content-Type: application/octet-stream');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($filename));
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Expires: 0');

    readfile($filename);
}

所以在这个文件结束时,我只想直接下载,但实际上并没有发生任何事情。

这是否有原因。

1 个答案:

答案 0 :(得分:1)

我不确切知道发生了什么,请尝试下面的代码:

<?php
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$name.'"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');

readfile($file);
?>