現在、「CakePHP3」と「javascript(jQuery)」を使用し、
以下のようなことをしようと思っております。
※下記のコードは参考程度のものです。
1: フォームからExcelファイルをアップロード。
(ファイル情報はajaxにて送信)
2: アップロードされたExcelファイルからのデータを取り出す。
(PHPExcelなど用いてセルの値など取得)
3: 取り出したデータをDB(postgres)へ、バルクインサート。
4(※悩み箇所): バルクインサート時に、
最大行($maxRow)と処理行数($count)をフロント側で取得し、
プログレスバーにて処理状況を表示。
5:インサート終了後、ajaxのsuccessに返る。
JavaScript
1$(function(){ 2 $('.import-btn').click(function(){ 3 var formData = new FormData(); 4 $.ajax({ 5 type : 'POST', 6 data : formData, 7 processData : false, 8 contentType : false, 9 url : '<?= $this->Url->build(["controller"=>"Test","action"=>"excelUpload"]) ?>', 10 success: function(json) { 11 // ここに来るのはバルクインサート完了後 12 } 13 }) 14 }); 15});
PHP
1// ajaxが飛ばされた excelUpload() の途中によばれます。 2// $excelData [ 3// '0' = [ 4// ['1行目', 'です', '。'] 5// [......] 6// ['100行目', 'です', '。'] 7// ], 8// '1' = [ 9// ['101行目', 'です', '。'] 10// [......] 11// ['200行目', 'です', '。'] 12// ], 13// ]; 14public function importExcel($excelData, $maxRow) 15{ 16 $this->autoRender = false; 17 18 $count = 0; 19 20 foreach ($excelData as $data) { 21 $query = $this->test->query() 22 ->insert(['value01', 'value02', 'value03']); 23 foreach ($data as $rowData) { 24 // 最大100行のデータを values() にセット 25 $query->values($rowData); 26 // 処理行数(これをフロント側で定期的に取得したい) 27 $count ++: 28 } 29 $query->execute(); 30 } 31}
というように、ajaxを飛ばした後 success に返ってくるまでに
フロント側が定期的に 処理行数($count)を取得し、
その値などでプログレスバーを動かし表示することは可能なのでしょうか?
また、ajaxを飛ばすのは一度きりという制限は設けていませんので、
複数回ajaxを使用すれば、ajaxのタイミングを変えれば処理状況に応じてのプログレスバーの表示が可能かもしれない
など、様々なアドバイスをいただけると幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。