【form】input[type=submit]で送信されたPOSTデータから、PHPで生成したCSVをダウンロードする

  • このエントリーをはてなブックマークに追加

フォームから PHP で抽出条件を POST し、処理結果を CSV でダウンロードする必要がありました。
なんとなく思いついたいくつかの方法を調べてみたものの、どれもこれもややこしい内容で…
正直なところ「これを実装するなら…」という記事ばかり。

そんな中、ダメ元でトライしてみた方法でさくっとできてしまったので、メモしておきます。

まずは結論から

フォーム情報を受け取る PHP ファイルのヘッダーを CSV 出力用に整えてあげるだけでした。
…なんじゃそりゃ(笑)

以下、ヘッダーの設定情報です。

header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=hoge.csv");

上記のヘッダー設定以降に、POSTデータの処理とか DB 処理とかを記述して、最終的な出力が CSV として整っていれば問題ありません。
諸々の処理が完了した時点で、ファイルダウンロードダイアログが表示されます。

ヘッダー情報をコメントアウトしておけば、通常のWebページとして表示されますので、開発中はコメントアウトしておけば良いでしょう。

紆余曲折(余談)

最初に思いついたのは jQuery を利用して ajax から POST する方法でした。
レスポンスデータを適当にループ処理して、CSV を生成しよう…ということです。
…この時点でレスポンスデータが CSV なら問題ないということに気付かなかったのは減点ですね。

次に思いついたのは、POST データ処理後に一時ファイルとして CSV をサーバーへ保存し、何らかのタイミングでダウンロードさせる方法でした。
「何らか」と言っている時点でお察しです。

そもそも、POST データを処理しなければいけないという事自体に気づいたのが、「DB から取得したデータをリンクから CSV ダウンロードする」という処理の実装後でした。
そこから、ふと「送信先をこれにしたらどうなるんだ…?」と思い、トライしてみたらできてしまった…ということになります。

入門書に書かれている内容かもしれませんが、個人的にはかなり悩んだ処理でしたので、誰かの助けになれば幸いです。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*