2012-04-19 47 views
0

我目前正在爲通過webapp生成的報告測試一個新的CSV導出功能。相關的代碼看起來如此:可以傳遞給特殊輸出流php://輸出的數據量是否有限制?

$my_report_data = ReportDAO::runCampaignAnalysis($campaign_id, $start_date, $end_date); 

$this->getResponse()->clearHttpHeaders(); 
$this->getResponse()->setHttpHeader('Content-Type', 'application/vnd.ms-excel'); 
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename='export.csv'); 

$outstream = fopen("php://output", "w"); 

function __outputCSV(&$vals, $key, $filehandler) { 
    $retval = fputcsv($filehandler, $tempArray); 
    if($retval == FALSE) { 
     error_log('Uh oh, spaghetti o!'); 
     error_log('The current line being processed is: ' . join('|', $vals)); 
    } 
} 

array_walk($my_report_data, "__outputCSV", $outstream); 
fclose($outstream); 

return sfView::HEADER_ONLY; 

$ my_report_data僅僅形式seen here的多維數組。

該代碼完美適用於小數據集,例如。 100行及以下(不太確定不幸的是截止點在哪裏)。使用更大的數據集;然而,當我嘗試導出到CSV時,我的瀏覽器不會顯示「文件打開/保存」對話框,原始報告內容會顯示在網頁上。

我已經用Firefox的'Live HTTP Headers'插件檢查了HTTP標頭,發現對於較大的數據集,標頭設置不正確並顯示爲'text/html; charset = utf-8'而不是'application/vnd.ms-excel'。非常奇怪。

回答

1

奇數:您可能想要嘗試定期清空輸出緩衝區。我發現我需要這樣做來防止類似的錯誤。沿線的東西:

if($len > 250){ $len = 0; if(ob_get_length()) ob_flush(); } 

其中$len是行數。凌亂,以適應您的array_walk,但這可能會有所幫助。

+0

感謝您的建議費米,但正如你指出,將它融入我目前的解決方案將是相當混亂。不知道如何刷新緩衝區可以解決標題神祕地恢復爲'文本/ HTML'的問題。 FWIW雖然我以前嘗試過但沒有成功。 – freakwincy 2012-04-19 14:56:19

0

我相信我找到了一個可能的解決方案。不完全確定它爲什麼起作用;但它的確如此。我在clearHttpHeaders調用之前只添加了以下內容:

ob_start('ob_gzhandler'); 

工作就像一個魅力。