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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

2126閲覧

Vue.jsからaxiosでlaravelにデータを送信するが、写真に関するデータ情報が送れない。

tenlife

総合スコア70

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/07/14 22:09

Vue.jsとlaravelで画像複数枚投稿の編集を実装しています。編集する際に新規ではなく変更された写真については送信する写真の情報にedit_image_idを使って変更する(元の)写真を取得、更新処理をしようと思っています。

解決したいこと: laravel側でedit_image_idを$imageの中のデータとして受け取りたい。

現状:
vueのdataformではedit_image_idが入っていることを確認出来ました。
しかし、laravel側で$imageの中にはedit_image_idの情報が入っていませんでした。

怪しいと感じる部分:
下にコードを載せましたが、自分がlaravelに送っている情報(img)と、実際にコントローラーで受け取っている情報($image)に違いがありました。この部分が怪しいと思うのですが、理解が乏しく解決できませんでした。

vue

1       data() { 2 return { 3 images: [] 4 } 5 }, 6          7          ...省略 8 9 const reader = new FileReader(); 10 reader.onload = (e) => { 11 edit_image.thumbnail = e.target.result; 12 edit_image.edit_image_id = img.id; 13 this.images.splice(i, 1, edit_image); 14 }; 15 16 ...省略 17 18 dataform = new FormData(); 19 20 this.images.forEach(function(img) { 21 if(img.thumbnail) { 22 dataform.append('images[]', img); 23 } else { 24 return false; 25 } 26 }) 27           ...省略 28 29 let id = this.me_id 30 var array = ["http://127.0.0.1:8000/me/", id, "/update"]; 31 let path = array.join('') 32 axios.post(path, dataform).then(res => { 33 console.log('done') 34 }).catch(function(error){ 35 console.log(error) 36 })

controller

1foreach($request->images as $image) { 2 var_dump($image); 3}

以下の2つの部分が中身のデータ情報です。
送信側,受け取り側

imgの中身(送信) File {thumbnail: "data:image/jpeg;base64,/9j/4***Z", edit_image_id: 20, name: "5e0bf50ab91***", lastModified: 1561089569815, lastModifiedDate: Fri Jun 21 2019 12:59:29 GMT+0900 (日本標準時), …} name: "5e0bf50ab91***" lastModified: **** lastModifiedDate: ** webkitRelativePath: "" size: 500862 type: "image/jpeg" thumbnail: "data:image/jpeg;base64,/9j/4**" edit_image_id: 20 ここで取得できている __proto__: File
$imageの中身(受け取り) $image => Illuminate\Http\UploadedFile {#337 path: "/private/var/folders/kj/jv_***", filename: "phpqHh5jN", basename: "phpqHh5jN", pathname: "/private/var/folders/kj/jv_***", extension: "", realPath: "/private/var/folders/kj/jv_***", aTime: 2020-07-14 21:18:57, mTime: 2020-07-14 21:18:57, cTime: 2020-07-14 21:18:57, inode: 20893833, size: 500862, perms: 0100600, owner: 501, group: 20, type: "file", writable: true, readable: true, executable: false, file: true, dir: false, link: false, }

下記の様に考えてみましたが、解決策が見つからない状態です。
$imageはfileオブジェクトとして存在している。
中身の情報を比較すると、送信した際にimgの情報がそっくりそのまま$imageに送られているわけじゃなさそう?

$image->edit_image_id こんな形で使うのを想定しています。

どなたかお分かりになる方居ましたら、知恵を貸していただきたいです。
よろしくお願いいたします。

laravel 6.18
vue.js 2.6.11

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

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

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

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

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

guest

回答1

0

ベストアンサー

$image->edit_image_id こんな形で使うのを想定しています。

できません。

勘違いされている点ですが、当該JSコードにおけるimgFileオブジェクトです。JSの性質上、未定義のプロパティも追加こそ可能ですが、インタフェース外のプロパティを追加しても意味がありません。

FormDataでファイルを送信していますが、これにFileを渡した場合はペイロードに「フィールド名」「ファイル本文」「ファイル名」が載せられます。
これはmultipart/form-dataという形式で送信されますが、そのようなコードを書いたところでファイルに任意のヘッダを付加したりすることはできません。
一方で、FormDataにはファイル以外に文字列をペイロードに乗せることは可能なので、

if(img.thumbnail) { dataform.append('images[]', img); dataform.append('image_ids[]', img.id); }

のようなことを行うことは可能ですので、そのようにすればLaravel側に対照するIDを渡すことはできなくはないでしょう。(ただしこれはFileに他の情報を入れるのを推奨するものではなく、適当なオブジェクトでラップすることをおすすめします。)

投稿2020/07/14 22:47

編集2020/07/14 22:47
hina

総合スコア132

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

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

tenlife

2020/07/15 21:38

返信が遅れてしまいました。申し訳ありません。 回答ありがとうございます。fileオブジェクトに追加はできないと言うことなんですね!とても勉強になります。 現在教えていただいた考え方を参考に進めていましたが、また詰まってしまったので新しく質問を立てました! ご確認頂けると幸いです。 https://teratail.com/questions/278016?modal=q-comp
hina

2020/07/16 01:26

一応補足しておくと、 > The field's value. This can be a USVString or Blob (including subclasses such as File). If none of these are specified the value is converted to a string. です。つまり、`append`で渡せるのはBlobやFile、または文字列です。(文字列以外のオブジェクトをそのまま渡しても`.toString()`されますので追加の質問のようなことになります。)私が例示してるのはあくまで、渡す際にパラメータを分け、それぞれにファイルやIDを分けて入れています。 そもそも1リクエストで済ませるのが最適とも限りませんが。(ファイルアップロード専用のエンドポイントを用意することがよくあります)
tenlife

2020/07/18 02:45

返信遅れました。 説明を受けて再度、違う考え方で進めたところうまく実装することができました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問