2

Web ページで、以下のコードを使用していくつかのデータを CSV ファイルに書き込み、最後に fclose(); で閉じています。

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename='.$filename);
$out = fopen('php://output', 'w');
fputcsv($out, $cvs_cols);
fclose($out);
echo "HELLO WORLD"; // sneaks into CSV!?

既に fclose() が行われているのに、CSV ダウンロード ファイルに「HELLO WORLD」が入るのはなぜですか? ブラウザに表示するページの残りの HTML を出力したい。どうやってやるの?

4

4 に答える 4

5

1 つの HTTP リクエストの後、1 つのレスポンスが続きます。text/csvコンテンツ タイプとコンテンツ タイプtext/htmlを同時に送信することはできません(おそらくSPDYでは送信できますが、純粋な HTTP では送信できません)。

fcloseファイル記述子を閉じますが、ブラウザへの出力は閉じません。

また、ヘッダーを設定Content-Lengthしてファイルサイズを入れる必要があります。

マーク・ベイカーはすでにコメントの中で最も重要な点を述べています:

echoへの書き込みphp://outputは、コンテンツを同じストリームに入れます: STDOUT. 他のオプションは、CSV をメモリ (ただし、使用しない場合は無意味) またはファイルに書き込むことです。これらのストリームについて詳しくは、http ://www.php.net/manual/en/features.commandline.io-streams.php をご覧ください。

考えられる解決策:

2 つの HTTP リクエストが必要です。1 ダウンロード用、もう 1 つは HTML 用。最も一般的な方法は、最初に HTML 応答を使用して、次のようなものを配置することです。

<meta http-equiv="refresh"
      content="3; URL=http://yourserver.com/download.php?id=pdf&amp;id=123" />

これにより、3 秒後にダウンロードが開始されます。

于 2014-04-14T09:38:15.227 に答える
0

使用する

ob_clean() : ob_clean — 出力バッファをクリーン (消去)

flush() : flush — 出力バッファをフラッシュします( flush )

ob_start();

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename='.$filename);
$out = fopen('php://output', 'w');
fputcsv($out, $cvs_cols);
fclose($out);

ob_end_clean();   //    the buffer and never prints or returns anything.


echo "HELLO WORLD"; // sneaks into CSV!?
于 2014-04-14T09:38:54.563 に答える