現在の位置: ホーム> 最新記事一覧> header()を使用して、CSVレポートをダウンロードするシナリオをシミュレートする

header()を使用して、CSVレポートをダウンロードするシナリオをシミュレートする

M66 2025-05-18

Web開発では、バックエンドを介してCSVレポートを動的に生成し、ダウンロードするためにサーバーに配置する代わりに、ダウンロードするユーザーに提供する必要がある場合があります。 PHPのHeader()関数を使用してHTTP応答ヘッダーを変更し、それを出力コンテンツと組み合わせて、この「シミュレートされたダウンロード」効果を実現できます。

この記事では、この関数を段階的に実装することができます。

ステップ1:CSVデータを準備します

まず、出力するには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'],
];

ステップ2:HTTPヘッダーをセットアップします

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');

ステップ3:CSVコンテンツの出力

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);

注意すべきこと

  1. 追加の出力がない<br> Header()を呼び出す前に、不必要な出力(スペース、ラインブレーク、BOMを含む)はありません。そうしないと、「すでに送信されたヘッダー」エラーが発生します。

  2. コーディングの問題<br> 生成されたCSVに漢字が含まれている場合、UTF-8 BOMを使用するか、GBKに変換して、Excelで開くときに文字化けコードを避けることをお勧めします。

  3. 動的データ<br> 上記の例では、静的配列を使用しています。実際のプロジェクトでは、多くの場合、データベースから照会してからアレイに綴る必要があります。