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

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

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

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

Q&A

解決済

1回答

1541閲覧

fuelphpでajaxで先にサーバーに挙げたファイルとコメントを送信したい。

amaguri

総合スコア227

PHP

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

0グッド

0クリップ

投稿2017/07/25 09:25

編集2017/07/25 09:26

やりたいこと
action_add()でajaxで送信したデータを
action_index()で$piy_post->save();した時にコメントと一緒に保存できるようにしたい。

現在
ファイル送信フォームにてファイルを送信されたらajaxにアップロードしできているのですが
コメントを入力して送信ボタンを押すとコメントは保存できるのですが画像を保存することができません。

先にaction_add()で保存したファイルデータを
action_index()で$piy_post->save();した時に保存できるようにはどうすれば実装可能でしょうか?

JSは回答に記載させていただきました。

HTML

1index.php 2<section> 3 <?php echo Form::open(array('enctype' => 'multipart/form-data')) ?> 4 <div class="form"> 5 <table> 6 <tr> 7 <th>コメント<span class="form_require">*</span></th> 8 <td> 9 <?php echo Form::textarea("body",$piy_post->body,array("class" => "textarea-middle"))?> 10 </td> 11 </tr> 12 13 <tr> 14 <th colspan="2" class="btn_th"><input type="submit" name="submit" value="投稿" class="submit_button" onclick="return check_hope_date()"></th> 15 </tr> 16 </table> 17 </div> 18 <?php echo Form::hidden("mode", "do") ?> 19 <?php echo Form::close() ?> 20 21 22 <div class="container clearfix"> 23 <div class="row"> 24 <div class="col-md-12"> 25 <p>画像ファイルを選択してください(複数可)</p> 26 </div> 27 </div> 28 <div class="row"> 29 <div class="col-xs-2"> 30 <span class="fileUpload btn btn-default"> 31 ファイルを選択 32 <input type="file" class="uploadFile" accept="image/*" multiple/> 33 </span> 34 </div> 35 </div> 36 <hr /> 37 <div class="row"> 38 <div class="col-md-12" id="image-files"> 39 <ul class="list-inline list-unstyled"></ul> 40 </div> 41 </div> 42 </div> 43</section>
class Controller_Mypage_Piy extends Controller_Mypage { public function action_index() { $post = Input::post(); $default_values = array(); $post = myUtil::setDefaultPostData($post,$default_values); $file = Input::file(); $filedata = array(); $error_flag = false; $error_list = array(); // 初期オブジェクトの生成 $piy_post = Model_PiyPost::forge(); // validate $error_list = array(); if (!empty($post['mode'])) { $val = Model_Validate_PiyPost::validate('add'); if (!$val->run()) { parent::$_view->set_global('error', $val->error()); $error_flag = true; } } if (!empty($post['mode'])) { $piy_post->club_member_id = $this->_club_member->id; $piy_post->body = $post["body"]; $piy_post->lang = $this->_club_member->piy_lang; $piy_post->house_id = $this->_club_member->house->id; $piy_post->approval_flag = "H"; if ($this->_club_member->house instanceof Model_House) { Model_House::setHousesData(array($this->_club_member->house), Config::get("language")); } } // データをセット $data["lang"] = $this->_lang; $data["post"] = $post; $data["piy_post"] = $piy_post; $data["club_member"] = $this->_club_member; $data["filedata"] = $filedata; // モードに応じて処理を変える if ($this->_club_member->blog_flag != "X") { parent::$_view->set('content', ViewModel::forge('mypage/piy/wait')->set('data', $data)); } else if ((empty($post['mode'])) || $error_flag) { parent::$_view->set('content', ViewModel::forge('mypage/piy/index')->set('data', $data)); } elseif ($post['mode'] == 'do') // 確認 { // データをセーブ $piy_post->save(); // 表示 parent::$_view->set('content', ViewModel::forge('mypage/piy/do')); } parent::$_view->set('title', ' | '); return parent::$_view; } public function action_add() { //var_dump($_FILES['file']); if (isset($_FILES['file']['error']) && is_int($_FILES['file']['error'])) { try { switch ($_FILES['file']['error']) { case UPLOAD_ERR_OK: break; case UPLOAD_ERR_NO_FILE: throw new RuntimeException('ファイルが選択されていません'); case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: throw new RuntimeException('ファイルサイズが大きすぎます'); default: throw new RuntimeException('その他のエラーが発生しました'); } // MIMEタイプチェック $mimeTypeCode = @exif_imagetype($_FILES['file']['tmp_name']); if (!in_array($mimeTypeCode, array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG), true)) { throw new RuntimeException('画像でないファイル、又は未対応の画像形式です'); } // 作成したサムネイルデータを取得してbase64エンコード $imageFile = @base64_encode(@file_get_contents($_FILES['file']['tmp_name'])); $mimeTypeStr = @image_type_to_mime_type($mimeTypeCode); if ($imageFile && $mimeTypeStr) { // 画像を出力 echo "data:" . $mimeTypeStr . ";base64," . $imageFile; // ファイルアップロード // 初期オブジェクトの生成 $piy_post = Model_PiyPost::forge(); $default_values = array(); //$post = Input::post(); //$post = myUtil::setDefaultPostData($post,$default_values); $filedata = array(); $error_flag = false; $sizes = array( 'L' => array('w' => 400, 'h' => 400), 'M' => array('w' => 200, 'h' => 200), 'S' => array('w' => 100, 'h' => 100), ); $filedata = myImage::doConfirm2("clubmember/tmp/", $sizes, array("image/jpeg"), true); if (!empty($filedata['error'])) { parent::$_view->set_global('custom_error', $filedata['error']); $error_flag = true; } if($error_flag == false) { $filedatas = array( '0' => array( 'path' => $filedata['image'][0]->path, 'name' => $filedata['image'][0]->name, 'ext' => $filedata['image'][0]->ext, ) ); //ファイルアップロード $img_id = myImage::doDo($filedatas); if (!empty($img_id)) { $piy_post->img_id = $img_id[0]; } } } else { //MIMEタイプが取れていない際のエラー throw new RuntimeException('画像表示前になんらかのエラーが発生しました'); } } catch (RuntimeException $e) { //エラー情報をセットする //header('HTTP', true, 400); // bad requestを返すことにする $json = array(); $json['errorMessage'] = $e->getMessage(); echo json_encode($json,JSON_UNESCAPED_UNICODE); exit; } } exit; } }

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

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

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

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

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

guest

回答1

0

自己解決

JS

1<script type="text/javascript"> 2 var progressTemplate = "<div class=\"list-group-item\"><div class=\"progress progress-striped active\"><div class=\"progress-bar progress-bar-info\" style=\"width: 0%;\"></div></div></div>"; 3 4 $(function(){ 5 6 var def = $.Deferred(); 7 var promise = def; 8 9 $(".uploadFile").change(function() { 10 11 $.each(this.files, function(i, file){ 12 13 promise = promise.pipe(function(response){ 14 15 var newPromise = $.Deferred(); 16 17 var formData = new FormData(); 18 formData.enctype = "multipart/form-data"; 19 formData.append("file", file); 20 $("#progress-container").append(progressTemplate); 21 $.ajax({ 22 url: "/mypage/piy/add", 23 type: 'POST', 24 dataType: 'text', 25 data: formData, 26 cache: false, 27 contentType: false, 28 processData: false, 29 xhr: function() { 30 var xhr = $.ajaxSettings.xhr(); 31 if (xhr.upload) { 32 xhr.upload.addEventListener('progress', function(evt) { 33 var percent = (evt.loaded / evt.total) * 100; 34 $("#progress-container").find(".progress-bar").width(percent + "%"); 35 }, false); 36 } 37 return xhr; 38 }, 39 success: function(imageData) { 40 $("#image-files ul").append("<li><img class='imgView' width=100 height=100 src=\"" + imageData + "\" / ></li>"); 41 }, 42 error: function(xhr, textStatus, errorThrown) { 43 var res = {}; 44 try { 45 res = $.parseJSON(xhr.responseText); 46 } catch (e) {} 47 alert(res.errorMessage); 48 }, 49 complete: function() { 50 $("#progress-container").children().remove(); 51 newPromise.resolve(); 52 } 53 }); 54 return newPromise; 55 }); 56 }); 57 58 def.resolve(); 59 }); 60 }); 61</script>

投稿2017/07/25 09:26

amaguri

総合スコア227

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問