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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

jQuery

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

Ajax

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

Q&A

2回答

772閲覧

ajaxで画像情報を受け取ることができない

karirin3948

総合スコア20

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

jQuery

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

Ajax

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

0グッド

0クリップ

投稿2022/12/12 10:55

前提

ajaxを利用したファイルアップロードを行いたいのですが
コントローラファイル側で画像情報を受け取ることができません

実現したいこと

ajaxを利用してコントローラファイルで画像情報を受け取ること

該当のソースコード

js

1// メッセージを送信したとき 2$(document).on('click', ".message_submit", function() { 3 $.ajaxSetup({ 4 headers: { 5 "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"), 6 }, 7 }); 8 var current_user_id= $('.current_user_id').val(), 9 user_id = $('.destination_user_id').val(), 10 text = $('#message_counter').val(), 11 date=new Date(), 12 h = date.getHours(), 13 mi = date.getMinutes(), 14 hh = ('0' + h).slice(-2), 15 mmi = ('0' + mi).slice(-2), 16 day = hh + ':' + mmi; 17 18 //アップロードするファイルのデータ取得 19 var fiup_file = document.getElementById("my_image").files[0]; 20 //フォームデータを作成する 21 let form = $('#upload-form').get()[0];//フォームデータを格納 22 //フォームデータにアップロードファイルの情報追加 23 var formData = new FromData(form);//FormDataオブジェクト作成 24 $.ajax({ 25 type: 'POST', 26 url: '/ajax_message_process', 27 dataType: 'text', 28 data: { 29 current_user_id: current_user_id, 30 user_id: user_id, 31 text: text, 32 image: form 33 }, 34 processData: false, 35 contentType: false, 36 }).done(function() { 37 $('.message_add').replaceWith('<div class="my_message"><div class="mycomment right"><span class="message_created_at"> '+ day +' </span><p>'+text+'</p><img src='+current_user_img+' class="message_user_img"></div></div><input type="hidden" class="message_add">'); 38 $('#message_counter').val(''); 39 $('html, body').scrollTop($(document).height()); 40 }).fail(function() {}); 41});

php

1 public function ajax_message_process(Request $request) 2 { 3 $current_user = Auth::user(); 4 $date = new DateTime(); 5 $date->modify('+9 hour'); 6 $created_at = $date->format('Y-m-d H:i:s'); 7 if ($request->file('image') != '') { 8 $file_name = $request->file('image')->getClientOriginalName(); 9 $request->file('image')->storeAs('public/sample', $file_name); 10 $image = 'storage/sample/' . $file_name; 11 $param = [ 12 'user_id' => $current_user->id, 13 'destination_user_id' => $request->user_id, 14 'text' => $request->text, 15 'image' => $image, 16 'created_at' => $created_at, 17 ]; 18 } else { 19 $param = [ 20 'user_id' => $current_user->id, 21 'destination_user_id' => $request->user_id, 22 'text' => $request->text, 23 'created_at' => $created_at, 24 ]; 25 } 26 DB::table('messages')->insert($param); 27 }

試したこと

画像取得方法はこちらのサイトを参考にしました。
https://qiita.com/hotate_chan/items/ad38b62278b32079aa32

controller.php

12 $created_at = $date->format('Y-m-d H:i:s'); 3log::debug($request->file('image')); 4 if ($request->file('image') != '') { 5

このようにログを取得しているのですが、結果は空です。

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

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

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

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

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

yambejp

2022/12/13 01:10

質問はアップロードの仕方ですか?受けた側の処理の方法ですか?
karirin3948

2022/12/13 08:43

受けた側の処理方法です。 コントローラファイルでのファイル取得方法がわからなかったため質問しました。
guest

回答2

0

非同期でファイルを送信

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 btn.addEventListener('click',()=>{ 4 const body=new FormData(f); 5 fetch('api.php',{body,method:"post"}).then(x=>x.text()).then(console.log); 6 }); 7}); 8</script> 9<form id="f"> 10<input type="file" name="myfile"> 11<input type="button" value="send" id="btn"> 12</form>

//api.php

PHP

1<?PHP 2print_r($_FILES);

投稿2022/12/13 01:15

yambejp

総合スコア114779

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

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

0

他のかたも書いておられますが、
「送信側でちゃんと送られているか」と「受信側で受け取れているか」を分けて、
どこまで動いているかを切り分けるべきだとは思います。

怪しい点としては下記の箇所です

javascript

1 //アップロードするファイルのデータ取得 2 var fiup_file = document.getElementById("my_image").files[0]; 3 //フォームデータを作成する 4 let form = $('#upload-form').get()[0];//フォームデータを格納 5 6 // ~省略~ 7 8 data: { 9 current_user_id: current_user_id, 10 user_id: user_id, 11 text: text, 12 image: form 13 },

上記の箇所がちゃんとファイルを送ることができるような組み合わせになっているか疑問です。
「受けた側での処理がわからない」とのことですが、送信に失敗していませんか?

javascript

1 //フォームデータにアップロードファイルの情報追加 2 form.append("file", fileData);

参考にしたとのURLには上記のような記述がありますが抜けていませんか?
ajax の data 部分も違いますが、正しいですか?

確認してみてください

投稿2022/12/19 08:38

yamame

総合スコア81

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

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

karirin3948

2022/12/19 11:01

回答ありがとうございます。 確認します。
karirin3948

2022/12/19 11:38

ご指摘の通り 質問内容と参考ページに誤りがありました、失礼しました。 参考ページと同様に修正を行ったのですが、コントローラファイル側で画像情報を取得することができていませんでした。 ``` // メッセージを送信したとき $(document).on('click', ".message_submit", function() { $.ajaxSetup({ headers: { "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"), }, }); var current_user_id= $('.current_user_id').val(), user_id = $('.destination_user_id').val(), text = $('#message_counter').val(), date=new Date(), h = date.getHours(), mi = date.getMinutes(), hh = ('0' + h).slice(-2), mmi = ('0' + mi).slice(-2), day = hh + ':' + mmi; //アップロードするファイルのデータ取得 var fileData = document.getElementById("my_image").files[0]; //フォームデータを作成する var form = new FormData(); form.append("file", fileData); console.log(form); $.ajax({ : ``` おっしゃる通りjavascript側で送信に失敗している可能性があります。 formをコンソールログで確認したのですが、値は入っていました。(画像情報は入っていない可能性があります)
yamame

2022/12/20 00:23

ajaxのdataにはPOST(または、GET)のdataを列挙したような記述になると思いますが、 そこにformを一つの値として渡すと入れ子になってしまうのでは無いでしょうか? image : fileData のような形でformに入れずに送ればいいのでは無いですか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問