phpでCSVをダウンロードする時って割と見ると思うんですが、そういえばphpでCSVをダウンロードする方法を割りと知らなかったりするのでメモ。
今回、試したのがあるサイトのAPIを利用してjsonファイルからCSVファイルを作成してそれをダウンロードするという流れです。
この方法に関しては、まぁ割と一般的というは誰が書いても同じだと思うので詳しい説明は省いて書いておきます。
CSVをダウンロードするphpファイル
CSVファイルをダウンロードするプログラムのコードを載せます。
下記のような記述をする事で、プログラムで開くかダウンロードして保存するかのダイアログが標示させる仕組みとなる。*ただしGoogle Chromeだとそのままダウンロードされてしまう。
$fileName = "sample.csv"; //例としてsampleという名前です
header('Content-Type:application/octet-stream');
header('Content-Disposition:attachment; filename='.$fileName);
header('Content-Transfer-Encoding: binary');
header('Content-Length:'.filesize($fileName));
readfile($fileName);
上記のファイルをdownload.phpというファイルで作りました。*名前は任意
実際にCSVファイルを作成してダウンロードするまでの流れ
実際に自分がCSVファイルを作成して、ダウンロードするまでのファイルを載せておきます。とりあえずCSVファイルが無いと話にならないので、サーバー上に「sample.csv」というファイルを準備しておきます。
準備したファイルは下記のファイルです。
index.php | jsonファイルからCSVを作るファイル |
---|---|
download.php | ダイアログを表示してCSVファイルをダウンロードするためのファイル |
sample.csv | CSVファイル |
CSVファイルを作成するファイル
CSVをとあるサイトのAPIからCSVを作成するindex.phpの内容です。今回はCSVファイルをダウンロードするのが目的なので、CSV作成に関してはあくまでダミーです。
//あるサービスのAPIからデータをjson形式で取得
$json = json_decode(file_get_contents('APIでデータを取得するURL'));
//csvファイル
$csv_file="sample.csv";
//CSVデータの1行目のタイトルの部分
$csv ='post_id,post_name,post_author'."n";
//jsonファイルからデータを作成する。下記はあくまでサンプルなのでダミー
foreach($json->results->shop as $genre){
$csv.=$cnt.","; //post_id
$csv.="名前".","; //post_name
$csv.="admin".","; //post_author
$csv.="n";
//ポストIDをカウントで登録していく。
$cnt++;
}
//csvファイルを読み込み・書き込みでオープンする
$fp=fopen($csv_file,"r+");
flock($fp,LOCK_EX);
// CSVファイルの中身を空にする
// 既存の内容に追記していく場合は不要
ftruncate($fp, 0);
// CSVデータ$csvの内容をファイルに書き込む
fwrite($fp, $csv);
// CSVファイルを閉じる
fclose($fp);
ざっくり説明するとjsonファイルからデータを取得して、foreach文でデータを取り出しCSVファイルを作成しています。
その後に、予め用意しておいたsample.csvファイルをfopenで開き今回は上書きする為一旦ファイルを全部空の状態にしてデータをCSVファイルに書き込んでいく。という流れです。あとはindex.php内でdownload.phpへのリンクを張ればいいです。
で、最初に記載したCSVをダウンロードする為のdownload.phpファイルをそのままコピペして(CSVのファイル名は任意)ファイルを用意すればオッケーです。