「CSVファイルをダウンロードする方法はあるの?」
このように、PHPでCSVファイルを取り扱いたい機会があるかもしれません。
PHPではサーバーにCSVファイルを出力したり、サーバー上のCSVファイルをブラウザからダウンロードすることができます。今回はPHPでCSVファイルを出力・ダウンロードする方法についてご紹介していきます。
PHPによるCSVファイルの読み込み手順を解説目次
CSVファイルをダウンロードする方法とは
まずはCSVファイルのダウンロード方法についてご紹介します。
CSVファイルをダウンロードするには、header関数を使用してHTTPヘッダを設定し、ファイルを出力します。これはCSVファイルに限らず、画像ファイルやテキストファイルなど様々なファイルタイプでも使用することができます。
HTTPヘッダについて
HTTPヘッダは、 データ本体とは別にブラウザやデータに関する情報を加えるものです。
例えばサーバーへのリクエスト時にはどのようなブラウザがどういった情報をリクエストしているのか、またサーバーからのレスポンス時にはどのようなコンテンツを返すのか、といった役割があります。
ダウンロードするために設定をするHTTPヘッダには、以下の3つがあります。
- Content-Type
- Content-Length
- Content-Disposition
まずは「Content-Type」についてです。
ここではダウンロードするファイルのタイプを指定します。
例えばPDFファイルであれば「Content-Type: application/pdf」、PNGファイルであれば「Content-Type: application/png」のような形式で指定します。
「octet-stream」という形式は、ファイルタイプを意識する必要のない時に使用します。
続いて「Content-Length」についてです。
ここではダウンロードするファイルのサイズを指定します。ファイルのサイズ指定をすることで、ダウンロードの進捗状況を表示することができます。
最後に「Content-Disposition」についてです。
ここではファイルの処理方法を指定します。
例えば「Content-Disposition: attachment; filename=ファイル名」と指定することで、多くのブラウザは指定したファイル名でファイルを保存するダイアログを表示します。
headerの基本的な使い方について
HTTPヘッダは以下のように設定します。
1 |
header ($ヘッダ文字列[, $同じ名前のヘッダが指定された際、値を置換するか[, $レスポンスコード]] ) |
引数について、第一引数に送信するヘッダ文字列を指定します。
第二引数には、「Content-Type: application/pdf」「Content-Type: application/png」のように、同じ名前のヘッダが指定された場合に値を置き換えるか指定します。デフォルトはtrueで置き換えられますが、falseを指定すると両方の値を送ろうとすることを覚えておきましょう。
第三引数は、HTTPレスポンスコードを強制的に指定したい場合に使用します。
ファイルのダウンロード
それではいよいよファイルのダウンロードです。下記のサンプルコードをご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php // ダウンロードするサーバのファイルパス $filepath = 'webukatu.csv'; // HTTPヘッダ設定 header('Content-Type: application/octet-stream'); header('Content-Length: '.filesize($filepath)); header('Content-Disposition: attachment; filename=download.csv'); // ファイル出力 readfile($filepath); ?> |
ファイルサイズの取得とファイル出力時に使用するための「$filepath」を使用します。このファイルパスは絶対パスでも相対パスでも指定可能です。
続いてheader関数でHTTPヘッダを設定します。最後に「readfile関数」でファイル出力させるプログラムです。
CSVファイルを出力する方法とは
では次に、CSVファイルの出力方法をご紹介します。
今回ご紹介する出力方法は2通りあり、「fputcsv関数」と「SplFileObjectクラス」を使い出力させていきます。
fputcsv関数について
fputcsv関数でCSV形式のデータをファイルに出力するには、下記のコードを記述します。
1 |
int fputcsv ( $ファイルポインタ , array $書き込む値の配列 [, string $区切り文字 = "," [, string $フィールド囲み文字 = '"' [, string $エスケープ文字 = "\" ]]] ) |
この際、第一引数にファイルポインタを指定しています。ファイルポイントは事前にfopen関数などで、正常にオープンされたファイルを指定しなければいけません。
続いて第二引数には、書き込む値を配列で指定しています。
第三引数には区切り文字、そして第四引数にはフィールド囲い文字、第五引数にはエスケープ文字を指定しています。
少し記述が難しいですが覚えていきましょう。
戻り値として、書き込んだ文字列の長さを返します仮に失敗した場合はFALSEを返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $data = [ ['ID', '名前', '年齢'], ['1', 'ウェブカツ太郎', '20'], ['2', 'ウェブカツ花子', '25'], ['3', '齊藤ウェブカツ', '33'] ]; $fp = fopen('member.csv', 'w'); foreach ($data as $line) { fputcsv($fp, $line); } fclose($fp); ?> |
実行結果:member.csv
$dataが書き込む値の配列となります。そしてfopen関数を使用し、’member.csv’を書き込みモード’w’でオープンします。
その後配列を一つずつputcsv関数に渡して、member.csvに書き込みます。
最後にfclose関数でファイルをクローズする流れです。
SplFileObjectクラスについて
SplFileObjectクラスのfputcsvメソッドを使用してCSV形式のデータをファイルに出力するには、下記のコードを記述します。
1 2 3 |
$file = new SplFileObject( $ファイル名, 'w' ); $file->fputcsv($書き込む値の配列); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $data = [ ['ID', '名前', '年齢'], ['1', 'ウェブカツ太郎', '20'], ['2', 'ウェブカツ花子', '25'], ['3', '齊藤ウェブカツ', '33'] ]; $file = new SplFileObject('member.csv', 'w'); foreach ($data as $line) { $file->fputcsv($line); } ?> |
実行結果:member.csv
「SplFileObjectクラス」は、ファイル操作を行うための様々なインターフェイスを提供するクラスです。
まとめ
いかがでしたか?
今回の記事では、「CSVファイルのダウンロード・出力方法」についてご紹介しました。
PHPではCSVファイルのダウンロード、出力が可能なので、この機会にぜひ覚えておきましょう。
PHPオンラインで学習しよう!サイトやスクールを紹介