2013-10-03 88 views
0

这是针对该文件的csv文件创建和强制下载。PHP CSV创建并强制下载

这个工作,但我需要知道它是否正确的方式。

公共职能exportCSV($结果){

try { 

     $filename = CSV_PATH.'file.csv'; 

     $numRows = count($results); 

     $handle = fopen($filename, 'w+') or die("can't open file"); 

     fputcsv($handle, array('id','name','age','address')); 

     foreach ($results as $row) { 

      fputcsv($handle, $row); 
     } 

     fclose($handle); 

     header('Content-Disposition: attachment; filename="'.basename($filename).'"'); 
     header('Content-Transfer-Encoding: binary'); 
     header('Content-Length: '.filesize($filename)); 
     header('Connection: close'); 
     readfile($filename); 
     exit(); 

    } catch(Exception $e) { 
     echo $e->getMessage(); 
    } 
} 

CSV_PATH是config.php文件

+0

就我个人而言,我会使用tempfile而不是具有固定名称的文件......如果两个不同的用户同时请求csv下载,那么您将不会遇到任何问题;并且它可以在磁盘发送到浏览器之后删除磁盘上的文件 –

回答

0
use string rather then file writing it causes lot of overhead. 
    $out = ""; 
    $out .= implode(",", array('id','name','age','address')) . "\r\n"; 

    foreach ($results as $row) { 
     $out .= implode(",", $row) . "\r\n"; 
    } 

现在做的一样。

.... 
header('Connection: close'); 
echo $out; 
+0

为什么当fputcsv()函数处理很多潜在的数据问题(您的代码没有)时建议手动创建每一行(例如地址中的逗号字段) –

+0

请不要告诉,当没有文件获取'filesize'时,OP如何设置内容长度标题?你如何处理看起来像这样的数据:_“我的地址123,邮编”_ <---','也是CSV分隔符。 'fputcsv'会用引号括起这些数据,你的方法不会这样做...... –