• ベストアンサー

phpでcsvダウンロードできない

phpで配列をCSV にしてボタンを押すとブラウザからダウンロードさせたいのですが、 htmlタグで表示した後に、ボタンを押すとブラウザからダウンロードさせるには、以下の ヘッダーをhtmlタグより下につけると、機能しなくなってダウンロードできなくなって しまっています。 どうしたらいいのでしょうか。 header('Content-Type:application/octet-stream'); header('Content-Disposition:attachment;filename=data.csv');

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5253/13739)
回答No.4

> 分けるとは、今、1画面を2画面にするということでしょうか? > 一旦サーバに、csv を作成して2画面めでダウンロードさせるということでしょうか。 ダウンロード用のボタンがあるページのHTMLを送出する処理と、CSVを送出処理を1回のHTTPセッションで行う事は不可能です。 ブラウザはHTMLを受け取ったら画面上にレンダリングする処理に移るので、HTMLデータと一緒にCSVデータを送ってもブラウザはHTMLを表示することしかしてくれません。 なので、まずはボタンを表示するHTMLをブラウザに送出しサーバ側の処理は終了、ユーザーがボタンをクリックしたら新たにブラウザからサーバにHTTPリクエストが送られ、それに対してCSVデータをサーバが返す必要があります。 もし、CSVの生成に時間が掛かるため、CSVの生成が終わってからダウンロードボタンを表示したいのであれば、CSVを生成してサーバに保存し、保存し終わった時点でダウンロードボタンのあるHTMLを出力をするしかありません。

devid
質問者

お礼

ありがとうございました。 別にファイルを作成する事にします。

その他の回答 (3)

  • t_ohta
  • ベストアンサー率38% (5253/13739)
回答No.3

ボタンを表示するHTMLを出力するためのプログラムと、CSVを出力するためのプログラムを分けましょう。 HTTPというプロトコルは1回の通信で2つの事は出来ません。

devid
質問者

補足

分けるとは、今、1画面を2画面にするということでしょうか? 一旦サーバに、csv を作成して2画面めでダウンロードさせるということでしょうか。

回答No.2

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;

参考URL:
http://php.net/manual/ja/function.header.php
devid
質問者

補足

ヘッダーを一番先頭にすると、何も処理が始まる前に、ダウンロードになってしまいます。 色々処理して出力した後、ボタンを押してcsv 出力したいので、タグが入ってしまいまず。

  • ezshinji
  • ベストアンサー率0% (0/1)
回答No.1

header(~); header(~); echo XXX(CSV情報); exit; headerの内容はあってるか忘れてしまいましたが、↑のようにしてできないでしょうか?

関連するQ&A

専門家に質問してみよう