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

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

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

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

JavaScript

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

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

1228閲覧

非同期通信を使用して画像をアップロードしたい。

amaguri

総合スコア227

PHP

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

JavaScript

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

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

2クリップ

投稿2017/07/19 07:33

編集2017/07/19 08:46

現在FuelPHPをりよ空いて開発しているのですが
画像を一度に複数上げるために非同期通信を実装したいです。
参考にしているサイト
実装したい機能イメージ
このように画像を複数あげられるコードを書きたいのですが
参考にしているサイトが

画像のリサイズ処理
ランダム文字列生成
の処理が省略されており
実際にサンプルを動かそうにもう動かせない状況です。
非同期実装を実現するには
どのようにコードに手を加えれば良いでしょうか?
また参考サイトの画像upload処理をどうしたら実装できるようになりますでしょうか?

現在のコード(同期通信)
非同期通信にて送信できるように今回質問しました。
現在は一枚一枚HTMLとPHPにて動く実装になっています。

HTML

1<article> 2 <h3 class="h_pat01">画像UpLord用</h3> 3</article> 4 5<?php echo View::forge('member/error'); ?> 6<section> 7 <?php echo Form::open(array('enctype' => 'multipart/form-data')) ?> 8 <div class="form"> 9 <table> 10 <tr> 11 <th>画像<span class="form_require">*</span></th> 12 <td class="imgInput"> 13 <div><?php echo Form::file('file1[0]'); ?></div> 14 </td> 15 </tr> 16 <tr> 17 <th>コメント<span class="form_require">*</span></th> 18 <td> 19 <?php echo Form::textarea("body",$piy_post->body,array("class" => "textarea-middle"))?> 20 </td> 21 </tr> 22 23 <tr> 24 <th colspan="2" class="btn_th"><input type="submit" name="submit" value="投稿" class="submit_button" onclick="return check_hope_date()"></th> 25 </tr> 26 </table> 27 </div> 28 <?php echo Form::hidden("mode", "do") ?> 29 <?php echo Form::close() ?> 30</section> 31 32<script type="text/javascript"> 33 $(function(){ 34 var setFileInput = $('.imgInput'); 35 36 setFileInput.each(function(){ 37 var selfFile = $(this), 38 selfInput = $(this).find('input[type=file]'); 39 40 selfInput.change(function(){ 41 var file = $(this).prop('files')[0], 42 fileRdr = new FileReader(), 43 selfImg = selfFile.find('.imgView'); 44 45 if(!this.files.length){ 46 if(0 < selfImg.size()){ 47 selfImg.remove(); 48 return; 49 } 50 } else { 51 if(file.type.match('image.*')){ 52 if(!(0 < selfImg.size())){ 53 selfFile.append('<img alt="" class="imgView">'); 54 } 55 var prevElm = selfFile.find('.imgView'); 56 fileRdr.onload = function() { 57 prevElm.attr('src', fileRdr.result); 58 } 59 fileRdr.readAsDataURL(file); 60 } else { 61 if(0 < selfImg.size()){ 62 selfImg.remove(); 63 return; 64 } 65 } 66 } 67 }); 68 }); 69 }); 70</script>

PHP

1{ 2 /** 3 * メニューを表示 4 * 5 * @return $_view ビュー 6 */ 7 public function action_index() 8 { 9 10 $post = Input::post(); 11 $default_values = array(); 12 $post = myUtil::setDefaultPostData($post,$default_values); 13 14 $file = Input::file(); 15 $filedata = array(); 16 17 $error_flag = false; 18 $error_list = array(); 19 20 21 // 初期オブジェクトの生成 22 $piy_post = Model_PiyPost::forge(); 23 24 25 // validate 26 $error_list = array(); 27 if (!empty($post['mode'])) 28 { 29 $val = Model_Validate_PiyPost::validate('add'); 30 if (!$val->run()) 31 { 32 parent::$_view->set_global('error', $val->error()); 33 $error_flag = true; 34 } 35 } 36 37 if (!empty($post['mode'])) { 38 $piy_post->club_member_id = $this->_club_member->id; 39 $piy_post->body = $post["body"]; 40 $piy_post->lang = $this->_club_member->piy_lang; 41 $piy_post->house_id = $this->_club_member->house->id; 42 $piy_post->approval_flag = "H"; 43 44 if ($this->_club_member->house instanceof Model_House) { 45 Model_House::setHousesData(array($this->_club_member->house), Config::get("language")); 46 } 47 48 // ファイルアップロード 49 if ((!empty($file['file1']['name'])) || (!empty($post['filedata']))) { 50 if ($post['mode'] == 'do') { 51 $sizes = array( 52 'L' => array('w' => 400, 'h' => 400), 53 'M' => array('w' => 200, 'h' => 200), 54 'S' => array('w' => 100, 'h' => 100), 55 ); 56 57 $filedata = myImage::doConfirm2("clubmember/tmp/", $sizes, array("image/jpeg"), true); 58 if (!empty($filedata['error'])) { 59 parent::$_view->set_global('custom_error', $filedata['error']); 60 $error_flag = true; 61 } 62 63 if($error_flag == false){ 64 $filedatas = array( 65 '0' => array( 66 'path' => $filedata['image'][0]->path, 67 'name' => $filedata['image'][0]->name, 68 'ext' => $filedata['image'][0]->ext, 69 ) 70 ); 71 //var_dump($filedatas); 72 73 //ファイルアップロード 74 $img_id = myImage::doDo($filedatas); 75 if (!empty($img_id)) { 76 $piy_post->img_id = $img_id[0]; 77 //var_dump($img_id[0]); 78 } 79 } 80 81 82 } 83 } 84 } 85 86 // データをセット 87 $data["lang"] = $this->_lang; 88 $data["post"] = $post; 89 $data["piy_post"] = $piy_post; 90 $data["club_member"] = $this->_club_member; 91 $data["filedata"] = $filedata; 92 93 // モードに応じて処理を変える 94 if ($this->_club_member->blog_flag != "X") 95 { 96 parent::$_view->set('content', ViewModel::forge('mypage/piy/wait')->set('data', $data)); 97 } 98 else if ((empty($post['mode'])) || $error_flag) 99 { 100 parent::$_view->set('content', ViewModel::forge('mypage/piy/index')->set('data', $data)); 101 } 102 elseif ($post['mode'] == 'do') // 確認 103 { 104 // データをセーブ 105 $piy_post->save(); 106 107 // 表示 108 parent::$_view->set('content', ViewModel::forge('mypage/piy/do')); 109 } 110 111 parent::$_view->set('title', ' | '); 112 return parent::$_view; 113 } 114}

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

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

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

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

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

m.ts10806

2017/07/19 08:22

現在のコードで何かエラーが出ているようなら(javascript,php共に)追記してください。
amaguri

2017/07/19 08:42

現在はエラーは出ていません。現在は一枚ずつ同期通信なので非同期であげるやり方が知りたくて質問しました
guest

回答1

0

ベストアンサー

やらなくてはいけないことがたくさんあるのでとりあえずサンプル上げておきます

  • mypage.htm

HTML

1<script src="https://www.promisejs.org/polyfills/promise-6.1.0.min.js"></script> 2<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 3<script> 4$(function() { 5 $('input[type=file]').on('change',function(){ 6 var fd = new FormData(); 7 var file=$(this).prop('files'); 8 var me=$(this); 9 var prm=[]; 10 $.each(file,function(i,j){ 11 prm[i]= new Promise(function(resolver){ 12 var fr = new FileReader(); 13 fr.addEventListener("load", function(e){ 14 fd.append(me.attr('name'), new Blob([e.target.result],{"type":j.type}),j.name ); 15 console.log(1) 16 return resolver(this); 17 }); 18 fr.readAsArrayBuffer(j); 19 }); 20 }); 21 Promise.all( prm ).then(function(){ 22 $.ajax({ 23 "url":"recv_ajax.php", 24 "type":"post", 25 "data":fd, 26 "dataType":"json", 27 "processData": false,//appendからみ 28 "contentType": false,//fileからみ 29 }).done(function(data){ 30 data.map(function(i){ 31 $('form').after($('<img>').attr('src',i)); 32 }); 33 }).fail(function(xhr,error){ 34 console.log(error); 35 }); 36 }); 37 }); 38}); 39</script> 40<form method="post" action="recv.php" enctype="multipart/form-data"> 41<input type="file" name="img1[]" accept="image/*" multiple><br> 42<input type="submit" value="go"><br> 43</form> 44
  • recv_ajax.php

PHP

1<?php 2if(isset($_FILES['img1'])){ 3 $img=[]; 4 foreach($_FILES['img1']['tmp_name'] as $key=>$val){ 5 $fp = fopen($val,"r"); 6 $src=fread($fp,$_FILES['img1']['size'][$key]); 7 fclose($fp); 8 $img[] = 'data:'.$_FILES['img1']['type'][$key].';base64,'.base64_encode($src); 9 /*mimeだけ修正*/ 10 } 11 print json_encode($img); 12} 13?>
  • recv.php

PHP

1<?php 2if(isset($_FILES['img1'])){ 3print_r($_FILES['img1']); 4} 5?>

投稿2017/07/19 09:26

編集2017/07/20 03:11
yambejp

総合スコア114784

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

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

amaguri

2017/07/20 02:20

実装したみたのですが参考サイトのような 動きにならずでした。。。
yambejp

2017/07/20 02:54 編集

ごめんなさい、どこが想定と違うか具体的に提示して下さい
yambejp

2017/07/20 02:54

ちなみに私のソースは、multipleで選んだファイルを 選んだタイミングでajaxで送信し、結果をimgタグで表示する部分のみです 質問者さんの環境でそれが動かないのか? それとも別の機能まで実装してほしいというのか? そのあたりを補足下さい
amaguri

2017/07/20 03:16

やりたいことが ajaxの非同期で送るとともに ・画像の複数選択が可能 ・参考サイトのように選択した画像の読み込みご、プレビューの表示 を行いたいです
yambejp

2017/07/20 03:27 編集

Win版のIE11,Edge,Firefox,chromeで試したところ、 動いているようです。 質問者さんの環境を提示した上で、どの部分が動かないのでしょうか? ・複数画像が選択できない? ・選択した画像が表示されない? ・その他?
amaguri

2017/07/20 05:16

mac クローム環境で実装したのですが 画像は複数選択できるのですが 選択した画像のプレビューはです 選択した画像の表示もできません。l
yambejp

2017/07/20 05:20

$.ajaxの戻り値が返ってきてるかどうか .doneのコールバックの中で console.log(data) して確認してみてください。 つまり、送ったけど返ってきてないのか、送ってないかで詰まっている 箇所が違うと思います
amaguri

2017/07/20 05:25

試してみたいと思います。
yambejp

2017/07/20 05:33

今更ですが、今回提示したソースのポイント ・ajaxが使える ・ajax処理にformdataを利用 ・formdataにfileをセットするためにfilreaderを利用 ・filereaderの読み込み待ちにpromiseを利用 ・画像の戻りにbase64エンコードを利用 ・ajaxのdataTypeにJSONを利用 このあたりのどこかで引っかかっているのだと思います
amaguri

2017/07/20 05:53

無事解決しました!!ご丁寧にありがとうございました!! 参考のサイトの同様の動きもテストしたいので 別の質問させていただきます!
yambejp

2017/07/20 05:59

あら・・・通ってしまいましたか? 凡ミスなら不問ですが、どこで詰まっていたか提示してもらったほうが ナレッジベースとしてはよろしいかと
amaguri

2017/07/20 06:02

すみませんファイルの参照先をまちがていました。 すみませんでした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問