Web開発では、バックエンドを介してCSVレポートを動的に生成し、ダウンロードするためにサーバーに配置する代わりに、ダウンロードするユーザーに提供する必要がある場合があります。 PHPのHeader()関数を使用してHTTP応答ヘッダーを変更し、それを出力コンテンツと組み合わせて、この「シミュレートされたダウンロード」効果を実現できます。
この記事では、この関数を段階的に実装することができます。
まず、出力するにはCSVデータのコピーが必要です。データベースから抽出することも、手動で準備された配列にすることもできます。
$data = [
['名前', '郵便', '登録時間'],
['チャン・サン', 'zhangsan@m66.net', '2025-05-01 10:00:00'],
['li si', 'lisi@m66.net', '2025-05-02 11:30:00'],
['王ウー', 'wangwu@m66.net', '2025-05-03 14:15:00'],
];
Header()関数を使用して、これが通常のWebページの出力ではなく、ファイルのダウンロード応答であることをブラウザに伝えます。特に重要なのは:
コンテンツタイプは、これがCSVファイルであることをブラウザに伝えます。
Content-Dispositionは添付ファイルフォームを設定し、ダウンロードしたファイルの名前を提供します。
キャッシュ制御とプラグマは、キャッシュの問題を避けるのに役立ちます。
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="report.csv"');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
FOPEN( 'php:// output'、 'w')を使用して、コンテンツを出力ストリームに直接書き込むことができます。また、中間ファイルを生成する必要はありません。
$output = fopen('php://output', 'w');
foreach ($data as $row) {
fputcsv($output, $row);
}
fclose($output);
<?php
$data = [
['名前', '郵便', '登録時間'],
['チャン・サン', 'zhangsan@m66.net', '2025-05-01 10:00:00'],
['li si', 'lisi@m66.net', '2025-05-02 11:30:00'],
['王ウー', 'wangwu@m66.net', '2025-05-03 14:15:00'],
];
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="report.csv"');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
$output = fopen('php://output', 'w');
foreach ($data as $row) {
fputcsv($output, $row);
}
fclose($output);
追加の出力がない<br> Header()を呼び出す前に、不必要な出力(スペース、ラインブレーク、BOMを含む)はありません。そうしないと、「すでに送信されたヘッダー」エラーが発生します。
コーディングの問題<br> 生成されたCSVに漢字が含まれている場合、UTF-8 BOMを使用するか、GBKに変換して、Excelで開くときに文字化けコードを避けることをお勧めします。
動的データ<br> 上記の例では、静的配列を使用しています。実際のプロジェクトでは、多くの場合、データベースから照会してからアレイに綴る必要があります。