がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

「文字コードを変換しつつCSVファイルを出力する」時の書き方

gallu.hatenadiary.jp で読み込みを書いていたのですが、書き出しをそういや書いてなかったなぁ、と思って。

先にちょろっと考察したいのが、Content-Type。
本来は text/csv が正解。
ただ、割とちょいちょい application/octet-stream を見かけて*1、まぁその辺は「どっちでもなのかなぁ」と。
なんか、以前に「"いいからとにかくダウンロードしろや"って時に octet-stream を使う」的な話を聞いた記憶があるのですが、ちょいとその辺はすみません曖昧な感じです。
とりあえず今回は、綺麗に text/csv を使います、が、まぁお好みで。

ダウンロードファイル名が「なんでもいい」のなら別なのですが、そうでなければまぁある程度指定をしたいと思うので、その辺は指定可能にしておきます。


ヘッダ出力が絡むので、一応「事前に ob_start() がcallされている」前提で記載をしています。
書いてなかったら、ob_end_clean(); をコメントアウトしてください。


出力データは $data に「配列の配列」の形で入っている前提です。

// キャッシュ破棄&終了
ob_end_clean();

// ダウンロード用ファイル名を作成
$download_filename = 'sample.' . date('Ymd') . '.csv';

// 必要なヘッダを出力
header('Content-Type: text/csv');
header("Content-Disposition: attachment; filename={$download_filename }");

// 出力用のハンドルの作成
$file_name = 'php://filter/write=convert.iconv.UTF-8%2FSJIS-win/resource=php://output';
$file_obj = new SplFileObject($file_name, 'w');

// 出力
foreach($data as $datum) {
    $file_obj ->fputcsv($datum);
}

細かい所をちょいちょいと忘れるので、メモ代わりに。

*1:excel とか名の付くヘッダは積極的に無視