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

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

ただいまの
回答率

88.91%

データベースに画像へのパスを保存したいがパスが作れない。(laravel, vue.js)画像複数枚投稿

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 133

tenlife

score 43

laravelとvueを使用して画像複数枚投稿を実装しています。

解決したいこと
データベースに保存するのは画像へのパスにしたい。(現状は画像本体が保存されます)

下記の様な形でstoreを実行したいのですが、下記がうまくいきません。
$path = $image->store('public');
$imageの値がおかしいと予想しています。

public function create(CreateMe $request)
    {
        dd(request()->all());
        $user = Auth::user();
        $me = new Me();
        $me->user_id = $user->id;
        $me->content = $request->content;

        $lists = explode(',', $request->images);

        $me->save();
        $image_list = [];
        foreach ($lists as $image) {
            $img = new Image();
            // $path = $image->store('public'); ここがうまく実行されない
            $read_temp_path = str_replace('public/', 'storage/', $image); <-ほんとは$pathにしたい
            $img->src = $read_temp_path;

            array_push($image_list, $img);

        }

        $me->images()->saveMany($image_list);

        return redirect()->route('post_index');
    }
$request->imagesの中身(vueから送られてきます)
$request->images
=> "5e0bf*.jpg,69CA5A*.JPG"
ここからexplodeで分けて処理してます。

なのでforeachでの$imageの値は下記の形(ファイル名)になっています。
5e0bf*.jpg
$path = $image->store('public');だと
message: "Call to a member function store() on string"が表示されてしまいます。おそらくobjectが求められているのだと思います。

$path = $image->store('public');
現状では上記の様な形で$pathを作成できる様にしたいのですが,$imageがstringと言われてしまっています。ファイル名が直接入っているのがよくなさそうです。

storeを実行するにはどの様な処理を書けば良いでしょうか?
もしくはそもそも$request->imagesの中身だとstoreは出来ないと言うことなのでしょうか?

どなたか知恵をお貸ししていただきたいです。
よろしくお願いします。

laravel6.18
vue.js 2.6.11

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

送信側がどうなっているのか、分からないですが…

formData.append('images[]', images); //imagesにファイルが配列で格納されている
axios.post('/upload', formData)
$me = new Me();

$file_path = [];
$dir_name = 'hoge';
if($request->has('images')) {
  foreach ($request->images as $image) {
    $image->store($dir_name); //画像がstorage/app/hogeフォルダに保存される
    $file_path[] = $dir_name.'/'.$image->getClientOriginalName();
  }
}

/* Meテーブルのパスを保存するカラムが分かりませんので仮にfilepathとします */
$me->filepath = serialize($file_path);
$me->save();

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/10 06:51

    回答ありがとうございます。
    こちらを参考に試したところ、送信側に問題があることがわかりそちらを修正することによって解決に至りました。
    やはり、おっしゃられていた送信側でした。。
    ありがとうございました!

    キャンセル

check解決した方法

0

現状の理解では、storeを使用するときはfile自体の情報が必要みたいです。
今回自分はfile名だけを受信していたのでうまく処理が走っていませんでした。

送信側でfile自体を配列の形で送ることによって解決することができました。

https://readouble.com/laravel/6.x/ja/filesystem.html

ここで、file objectが必要みたいなことを言っていたので参考にしました。
https://stackoverflow.com/questions/43930518/call-to-a-member-function-getclientoriginalextension-on-string

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る