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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Ajax

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

Q&A

解決済

1回答

4208閲覧

CakePHP3でAjax送信してファイルダウンロードがしたいです。

ssk

総合スコア332

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Ajax

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

0グッド

0クリップ

投稿2017/05/25 08:30

###前提・実現したいこと
PHP(CakePHP)で項目を選択してCSV出力する実装をしています。
ajaxでリクエストを送り、CSVダウンロードが始まるようにしたいです

###発生している問題・エラーメッセージ
ajaxリクエスト自体はうまくいっています。
コントローラー側でうまくとれていないようです。

###該当のソースコード
コントローラー側

PHP

1public function index() 2{ 3//CSV出力がクリックされた場合は検索結果を持ってる$queryを引数にexport()アクションへ 4 if($this->request->query('csv') === 'true'){ 5 $this->setAction('export',$query); 6 } 7} 8 9public function export($query) 10 { 11 12 $Export_Table = TableRegistry::get('Export_Dbackorders'); 13 $clumns = $Export_Table->find('all')->combine('value','name')->toArray(); 14 15 if($this->request->is(['ajax']) && $this->request->query('export') === 'true'){ 16 17 $results = $query->hydrate(false)->toArray(); 18 $request = $this->request->query; 19 $select_clumns = isset($request['select_clumns']) && $request['select_clumns'] !== '' ? $request['select_clumns'] : FALSE; 20 21 stream_filter_register('eolFilter', 'App\\Filters\\CsvEolFilterHelper'); 22 stream_filter_register('encodeFilter', 'App\\Filters\\CsvEncodeFilterHelper'); 23 24 $fp = fopen('php://output', 'w'); 25 26 // フィルタを開いたストリームに付加する 27 stream_filter_append($fp, 'eolFilter'); 28 stream_filter_append($fp, 'encodeFilter'); 29 30 // ダウンロードさせる 31 header('Content-Type: text/csv'); 32 header('Content-Disposition: attachment; filename="テスト.csv"'); 33 34 include ('../config/myconf/csvExport/Hoges.php'); 35 36 $this->autoRender = false; 37 38 //////////////////////////////////////////////////////////// 39 //fclose — オープンされたファイルポインタをクローズする 40 //////////////////////////////////////////////////////////// 41 42 fclose($fp); 43 } 44 45 $this->set('clumns', $clumns); 46 $this->set('title', 'CSVエクスポート'); 47 }

javascript側

javascript

1$(function() { 2 $("#submit").click(function() { 3 var results = []; 4 5 var result = $("#sortable").sortable("toArray"); 6 $(result).each(function() { 7 8 results.push('select_clumns[]='+ this); 9 10 }); 11 12 str = results.join('&'); 13 console.log(str); 14 //window.location.href = location.href + "&export=true&" + ; 15 //$(this).attr("href", location.href + "&export=true&" + results); 16 17 $("#result").val(results); 18 $.ajax({ 19 url: location.href + str, 20 processData: false, 21 contentType: false, 22 type: "GET", 23 }).done(function (response) { 24 alert("success"); 25 }).fail(function () { 26 alert("failed"); 27 }); 28 }); 29});

###補足情報(言語/FW/ツール等のバージョンなど)
location.href + strには
http://localhost/test/hoges?freeword=%E6%A03&select_clumns[]=id&select_clumns[]=dbo01&select_clumns[]=dbo02が入っています。

alert("success");になるので、ajax側は問題ないかと考えています。

ちなみに、ajaxではなくコメントアウトしている
window.location.href = location.href + "&export=true&" + ;で行うとCSVダウンロードが開始されます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ajaxはJavaScript側でPHPからのレスポンスを受け取るので、ダウンロードになりません。form要素を使ったGET/POSTか、ご自身で書かれている location.href で処理する方法が手早いです。

投稿2017/05/25 15:36

kei344

総合スコア69407

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

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

ssk

2017/05/28 04:46

ありがとうございます。 location.hrefで対応することに致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問