0

現在、Web アプリケーション経由で生成されたレポートの CSV への新しいエクスポート機能をテストしています。関連するコードは次のようになります。

$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 は、ここで見られる形式の単なる多次元配列です。

このコードは、たとえば 100 行以下の小さなデータセットで完全に機能します (残念ながら、カットオフがどこにあるかはよくわかりません)。より大きなデータセットを使用。ただし、CSV にエクスポートしようとすると、ブラウザーで [ファイルを開く/保存] ダイアログが表示されるのではなく、生のレポートの内容が Web ページに表示されます。

Firefox の「ライブ HTTP ヘッダー」プラグインを使用して HTTP ヘッダーを調べたところ、大きなデータセットではヘッダーが適切に設定されておらず、「text/html;」として表示されることがわかりました。「application/vnd.ms-excel」ではなく「charset=utf-8」。非常に奇妙です。

4

2 に答える 2

1

奇妙: 出力バッファを定期的にフラッシュしてみてください。同様のエラーを防ぐためにそれを行う必要があることがわかりました。次のようなもの:

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

は行$len数です。それをあなたのに合わせるのは面倒ですarray_walkが、それは役立つかもしれません。

于 2012-04-19T14:44:12.000 に答える
0

私は可能な解決策を見つけたと信じています。なぜ機能するのか完全にはわかりません。しかし、そうです。clearHttpHeaders への呼び出しの前に次を追加しただけです。

ob_start('ob_gzhandler');

魅力のように働きました。

于 2012-04-19T15:45:23.707 に答える