• ベストアンサー

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

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

  • devid
  • お礼率34% (166/478)
  • PHP
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5068/13242)
回答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% (5068/13242)
回答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

  • PHP→DB→CSV 「ダウンロードできません」

    DBの内容をPHPを使ってCSVに変換してダウンロードするプログラムを使っています。 プログラム(csv.php)の先頭に header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=output.txt"); header ("Content-Description: File Transfer"); を書いているのですが、いざダウンロードをする画面になるとoutput.csvでなくcsv.phpをダウンロードすることになってしまいダウンロードができません。 表示だけならばっちりでているのですが、、、ファイルタイプがHTMLとなっているのも意味不明です。 だれか助けてください(><

    • ベストアンサー
    • PHP
  • fileのダウンロードとページ移動を続けて行うには?

    初心者です。教えて頂けますか? フォームのボタンを押したらダウンロードする様に作りました。 ボタンを押したらダウンロードとページ移動を続けて行うには どの様にすれば良いでしょうか? header( "Content-Type: application/octet-stream" ); header( "Content-Disposition: attachment; filename=$contentFilePath" ); header( 'Content-Length: '.filesize($contentFilePath) ); readfile($contentFilePath);

    • ベストアンサー
    • PHP
  • PHPでのファイルダウンロードについて

    初めて質問させていただきます。 社内用でファイルのアップロード・ダウンロードができるシステムを開発しています。 PCからは問題なくアップロードもダウンロードも行えていたのですが、 スマホからアクセスしてダウンロードをすると失敗してしまいます。 下記のコードを使ってます。 ファイルの種類はいろいろなので、「application/octet-stream」にしてます。 が、それぞれのファイルタイプに合わせて変更させても状況は変わりませんでした。 -- header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$file_name.'"'); header('Content-Length: '.filesize($dl_file)); readfile($dl_file); exit; -- なにか解決策があるようでしたら、教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルのダウンロードが出来ない

    こんばんは。お世話になっております。 CSVファイルをダウンロードさせるスクリプトを作成したのですが、そのスクリプト(ファイル)を、さくらインターネットのサーバへアップすると「ダウンロードせずにブラウザに表示されるだけ」という状態になってしまいます。(ローカル上や別サーバでは問題ない) ファイル上に記述する、Headerですが、サイトによっていくつかの記述方法があったので、以下のように2種類のHeaderを試していますが、共に「さくらインターネットだけがダウンロードしない」状況です。 ファイルをダウンロードさせるスクリプトは、今回初めて作ってみたのですが、他にどのような対処法があるのかが分かりません。考えられる可能性だけでも結構ですので、アドバイスいただけると幸いです。 //Header("Content-type:application/x-csv;"); //header("Content-Disposition: inline; filename=$fname.csv"); header("Content-Type: application/octet-stream;"); header("Content-Disposition: attachment; filename=$fname.csv"); 以上、お忙しい中恐縮ですが宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • CSVのダウンロードでエラーメッセージ

    以下のプログラムで、データベースの内容をCSV出力しようとしますが、IE6.0SP2上では、「Internet Explorerでは、接続先サイト名 - XXX.phpをダウンロードできません。このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。」と表示されます。 対策方法教えてください。 ----------------------------- header("Pragma: cache;"); header("Content-Type: application/x-csv"); header("Content-Disposition: inline; filename=output.csv"); $db=mysql_connect("localhost","***","***"); mysql_select_db("test",$db); $rs=mysql_query("SELECT * FROM master",$db); ------------------------------------------------ ちなみに、以下でも同じエラーです ------------------------------------- header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=output.csv"); ----------------------------------------

    • 締切済み
    • PHP
  • 先にダウンロードダイアログを表示させる方法

    お世話になります。 ブラウザから「データ取得」なんてボタンを押すと、データベースからデータを取得して、結果をcsvとして出力するプログラムを考えています。 ただ、データがかなり大きいため、データを取得してくる間の待ち時間が結構あります。この間にブラウザを操作されたりするのも問題なので、ブラウザ側からはすぐに「ダウンロードダイアログ」が出せないでしょうか? あわよくば、ダウンロードしてる、みたいなフリの最中に計算処理とかできるかな?なんて考えたのですが… header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=$file.csv"); ~データ取得処理~ print $受け取ったデータ; こんなのでどうかなと思いましたが、ダメでした。何か良い方法ありませんでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • CSVファイルのダウンロードについて

    現在開発しているシステムでCSVファイルをダウンロードしたいのですがうまくいきません。どなたか問題の解決できる方お願いします。 現在、CGIでCSVファイルを作成しておきそれをファイルのリンクからダウンロードさせようとしています。 そこで問題になっているのがIEのバージョンが6以前なら普通にダウンロードが出来るのですが、バージョン6だとEXSELがブラウザ内で立ち上がります。 これの回避方法(まずダウンロードをしたいです。)はありませんか? 現在ファイルのヘッダーはこのようにしています。 print "Content-type: application/octet-stream\n" ."Content-Disposition: attachment; filename=aaa.csv\n\n" あと、このCGIプログラムをネスケ、mozillaで開くとソースがブラウザに表示されてしまいます。IEでは問題なく表示されるのにネスケとmozillaはどうしてこんなことが起きるのでしょうか? 少しわかりずらい文章になってしまって申し訳ありません。 どなたかお力を貸してください。お願いします。

    • 締切済み
    • CGI
  • PHPでファイルをダウンロードさせるコード

    PDFファイルをその場では開かせず、ダウンロードさせるコードを作成しています header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . basename($path_file) . '"'); header('Content-Length:' . $content_length); ファイルをダウンロードさせること自体は成功しており、ファイル容量も間違ってないのですが ダウンロード後に開こうとするとファイルが破損していて開くことができません。 また、ハイパーリンクから直接開かせた場合は問題なく表示できております。 原因の分かる方がいらっしゃいましたらアドバイスお願い致します。

    • ベストアンサー
    • PHP
  • CSVファイルのダウンロード

    <環境> PHP4.3.2 Windows2000 PostgreSQL RedHat Linux <求めていること> DBのデータをCSVファイルに書き出し、 ダウンロードボタン押下で ダイアログがアップしファイル保存ディレクトリ選択、保存。 <現在のソース> サーバーにtest.csvファイル作成後、 現在HTMLでダウンロードボタン押下でdownload.phpを呼び出し <input type=button value="ダウンロード" onClick="location.href='download.php'"> ---------------- download.php ------------------- <?php // 1.ディレクトリ指定 //$filename="/test/test.csv"; // 2.ディレクトリ指定なし $filename = "test.csv"; header("Content-disposition: attachment; filename=$filename"); header("Content-type: application/octet-stream"); ?> ---------------- download.php ------------------- 現在、 1番のディレクトリ指定だと downloadというファイルがダウンロードされるダイアログがアップし ダウンロードされます。 2番のディレクトリ指定なしだと もちろん空のtest.csvファイルがダウンロードされます。 実現したいのは/test/test.csvのファイルをダウンロードすることです。 色々なサイトで探してみて試しているのですが 初心者なもので、行き詰まってしまいました。 申し訳ありませんが ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • ダウンロードさせると*.phpにリネームされてしまう。

    phpでファイルのダウンローダを作成したのですが、IEで動かすと*.phpと動作しているphpのスクリプトネームにリネームされてしまいます。 FireFoxではリネームされる事無くダウンロードされるのですが、IEでの解決方法をご存知の方、どうぞご教授くださいませ。 コードは $filesize=filesize($filedldir); header ("Accept-Ranges: none"); header ("Content-Length: $filesize"); header ("Content-Type: application/octet-stream"); header ("Content-Disposition: attachment; filename=$fnames"); readfile ($filedldir); exit; といった感じです。 何がおかしいのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう