質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

7206閲覧

AjaxでPOSTしたデータをもとにPHPExcelを使ってファイルを作成してダウンロードしたい

natlpush

総合スコア32

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2018/04/14 20:36

一部割愛していますが、下記のようなコードでPHPExcelを操作してエクセルファイルをダウンロードできています。直接の実行なら問題なく動くのですが、AjaxでPOSTしても動きません。ファイル作成まではできているのですが、ダウンロードができない状況です。

基本的なことがわからないのでコピペでやっていますが、おそらくヘッダーのところを吐き出すことで問題が起きているように思います。

POSTデータからSQLで値を取得しエクセルをダウンロードする必要があるのですが、どのようにすればいいかお分かりになる方、お力をお貸しください。

よろしくお願いいたします。

//---------------------------------------------------------------- //phpExcelの操作 //---------------------------------------------------------------- //PHPExcelの処理 require_once("../PHPExcel/Classes/PHPExcel.php"); require_once("../PHPExcel/Classes/PHPExcel/IOFactory.php"); $excel = new PHPExcel(); $excel->setActiveSheetIndex(0); $sheet = $excel->getActiveSheet(); $sheet->setTitle('住所録'); //---------------------------------------------- // Excel2007形式で出力する //---------------------------------------------- header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment;filename="sample.xlsx"'); header('Cache-Control: max-age=0'); $writer = PHPExcel_IOFactory::createWriter($excel, "Excel2007"); $writer->save("../address.xlsx"); $result=download_file('../address.xlsx'); //---------------------------------------------------------------- //ファイルをダウンロードする関数 //---------------------------------------------------------------- function download_file($path_file) { /* ファイルの存在確認 */ if (!file_exists($path_file)) { die("Error: File(".$path_file.") does not exist"); } /* オープンできるか確認 */ if (!($fp = fopen($path_file, "r"))) { die("Error: Cannot open the file(".$path_file.")"); } fclose($fp); /* ファイルサイズの確認 */ if (($content_length = filesize($path_file)) == 0) { die("Error: File size is 0.(".$path_file.")"); } /* ダウンロード用のHTTPヘッダ送信 */ header("Content-Disposition: inline; filename=\"".basename($path_file)."\""); header("Content-Length: ".$content_length); header("Content-Type: application/octet-stream"); /* ファイルを読んで出力 */ ob_end_clean();// ファイルの内容を出力する前に入力バッファの中身をクリアする if (!readfile($path_file)) { die("Cannot read the file(".$path_file.")"); } }

Ajax

<script> $(function(){ $("#form").submit(function(){ //選択されたチェックボックスの値を配列に保存 var checks=[]; $("[name='check[]']:checked").each(function(){ checks.push(this.value); }); $.ajax({ type: "POST", url: "form.php", data: { "checks":checks }, success: function(data){ alert(data); } }); return false; //submitイベントハンドラにfalseを返し,action処理をキャンセル }); }); </script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ajaxではできないと思います。
dataTypeオプションにattachに準ずるものがあればいいのですが、ありません。

ajaxで受け取って返すのは処理とその結果であって出力そのものではありません。

PHPではファイルだけ作っておいて、作成可否の結果のみ受け取り別途ダウンロード用のPHPでattachを送信するしかないかと。

下記が参考になると思います。

つまり、わざわざajaxでやる必要がないということになります。
POST先をそのダウンロード用のPHPにして処理からファイルダウンロードのattachまでやってしまえばいいわけです。

投稿2018/04/14 22:55

編集2018/04/14 22:56
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natlpush

2018/04/15 10:07

ありがとうございます。PHPのPOSTとの違いがわかっていなかったので、とても勉強になりました。POST先をエクセル作成用のPHPに飛ばし、成功したときにlocation.hrefでダウンロード用ファイルの実行で解決しました。
m.ts10806

2018/04/15 10:28 編集

いえ、POST元が違うだけで受け取るPHPがやることは同じです。 POST元はあくまでフォームなのでPHPの話ではありません。 ajaxの場合はPOST元のコールバックで受け取れる形式に縛りがある(=受け取るPHPにもその制限を受ける)というだけです。 実際は実行されていたとしてもコールバック側は指定したdatatypeで受け取っているので一応何かしら返ってきているとは思います。(PHP関数の実行結果とか?試してないですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問