- ベストアンサー
phpでcsvダウンロードできない
phpで配列をCSV にしてボタンを押すとブラウザからダウンロードさせたいのですが、 htmlタグで表示した後に、ボタンを押すとブラウザからダウンロードさせるには、以下の ヘッダーをhtmlタグより下につけると、機能しなくなってダウンロードできなくなって しまっています。 どうしたらいいのでしょうか。 header('Content-Type:application/octet-stream'); header('Content-Disposition:attachment;filename=data.csv');
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> 分けるとは、今、1画面を2画面にするということでしょうか? > 一旦サーバに、csv を作成して2画面めでダウンロードさせるということでしょうか。 ダウンロード用のボタンがあるページのHTMLを送出する処理と、CSVを送出処理を1回のHTTPセッションで行う事は不可能です。 ブラウザはHTMLを受け取ったら画面上にレンダリングする処理に移るので、HTMLデータと一緒にCSVデータを送ってもブラウザはHTMLを表示することしかしてくれません。 なので、まずはボタンを表示するHTMLをブラウザに送出しサーバ側の処理は終了、ユーザーがボタンをクリックしたら新たにブラウザからサーバにHTTPリクエストが送られ、それに対してCSVデータをサーバが返す必要があります。 もし、CSVの生成に時間が掛かるため、CSVの生成が終わってからダウンロードボタンを表示したいのであれば、CSVを生成してサーバに保存し、保存し終わった時点でダウンロードボタンのあるHTMLを出力をするしかありません。
その他の回答 (3)
- t_ohta
- ベストアンサー率38% (5253/13739)
ボタンを表示するHTMLを出力するためのプログラムと、CSVを出力するためのプログラムを分けましょう。 HTTPというプロトコルは1回の通信で2つの事は出来ません。
補足
分けるとは、今、1画面を2画面にするということでしょうか? 一旦サーバに、csv を作成して2画面めでダウンロードさせるということでしょうか。
- erikirichan
- ベストアンサー率33% (1/3)
PHPの仕様上、headerでレスポンスヘッダを返す場合は 実際の 出力の前にコールする必要があります。なので、htmlタグを出力する前にheaderを呼んでください。 あと気になったのですが、なぜcsvを返すのにhtmlタグが必要になるのかがよくわからないです。ボタンを押したら下記のようなPHPを呼び出すようにすれば良いと思うのですが。 <?php header('Content-Type:application/octet-stream'); header('Content-Disposition:attachment;filename=data.csv'); $a = [["山田",24,165,"東京"],["佐藤",26,178,"山梨"]]; foreach ($a as $row) echo implode(',',array_map(function($v) {return "\"$v\"";}, $row)).PHP_EOL;
補足
ヘッダーを一番先頭にすると、何も処理が始まる前に、ダウンロードになってしまいます。 色々処理して出力した後、ボタンを押してcsv 出力したいので、タグが入ってしまいまず。
- ezshinji
- ベストアンサー率0% (0/1)
header(~); header(~); echo XXX(CSV情報); exit; headerの内容はあってるか忘れてしまいましたが、↑のようにしてできないでしょうか?
お礼
ありがとうございました。 別にファイルを作成する事にします。