LoginSignup
1
0

Laravel×Vueで、動的な画像保存&表示

Last updated at Posted at 2024-03-20

完全honaki用
悪しからず

保存 & 同コンポーネント内で表示

ProfileEditComponent.vue
<template>
    <div class="container">
        <h2 class="mt-5 text-center">プロフィール画像更新</h2>
        <div class="form-group">
            <label for="id">↓下をクリックして画像をアップロードしてください</label><br>
            <input type="file" v-on:change="fileSelected">
        </div>
        <button v-on:click="fileUpload" class="btn btn-danger">アップロード</button>
        <p v-show="showUserImage"><img v-bind:src="user.file_path"></p>
    </div>
</template>

<script>
export default {
    data: function(){
        return {
          fileInfo: '',
          user: '',
          showUserImage: false
        }
    },
    methods:{
        fileSelected(event){
            this.fileInfo = event.target.files[0]
        },
        fileUpload(){
            const formData = new FormData()

            formData.append('file',this.fileInfo)

            axios.post('/api/profile/:profileId/edit',formData).then(response =>{
                this.user = response.data
                if(response.data.file_path) this.showUserImage = true
            });
        }
    }
}
</script>
api.php
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Auth::routes();

Route::group(['middleware' => 'auth'], function () {
    // マイページ一覧表示
    Route::resource('/profile', 'ProfileController');
    // マイページ画像保存
    Route::post('/profile/:profileId/edit', 'ProfileController@file_up');
});
ProfileController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;
use App\Budget;
use App\Spending;
use App\User;
use Carbon\Carbon;

class ProfileController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        if (Auth::check()) {
            // ユーザーはログイン済み
            // $profile = Auth::user();
            // $profile = Auth::guard('api')->user()->get();
            // $profile = Auth::guard('api')->user()->get();
            // $profile = Auth::guard('api')->user()->get();
            // →これらはユーザー情報を取得できなかった

            $id = Auth::id(); 
            $profile = User::where('id', $id)->get();
            return $profile;
        }
    }
    
    public function file_up()
    {
        $file_name = request()->file->getClientOriginalName();
    
        request()->file->storeAs('public/',$file_name);
    
        // $user = User::find(1);
        $id = Auth::id(); 
        $user = User::find($id);

    
        $user->update(['file_path' => '/storage/'.$file_name]);
    
        return $user;
    }

publicにシンボリックリンクを貼る

ターミナル
$ php artisan storage:link

以下が出てくればOK
The [public/storage] directory has been linked.

参考:https://reffect.co.jp/vue/vue-js-laravel-file-upload#i-7

テーブルへのパスの保存

追加したfile_path列に書き込みを許可するためにモデルファイルUser.phpのfile_pathを$fillable変数に追加する

User.php
protected $fillable = [
    'name', 'email', 'password','file_path'
];

参考:https://reffect.co.jp/vue/vue-js-laravel-file-upload#i-8

別のコンポーネント表示する場合

ProfileComponent.vue
<template>
    <div class="container">
        <h2 class="mt-5 text-center">プロフィール</h2>
        <form v-for="(profile, index) in profiles" :key="index">
            <div class="profile-picture mx-auto mt-3">
                // ⭐️ここ
                <img v-bind:src="profile.file_path" class="img-fluid" alt="Profile Picture">
            </div>
            <router-link v-bind:to="{name: 'profile.edit', params: {profileId: profile.id}}">
                <div class="mb-5 text-center"><button type="submit" class="btn btn-primary">編集</button></div>
            </router-link>
            <div class="form-group">
                <label for="id">名前</label>
                <input type="text" class="form-control" id="name" readonly v-model="profile.name">
            </div>
            <div class="form-group ">
                <label for="id">メールアドレス</label>
                <input type="text" class="form-control" id="email" readonly v-model="profile.email">
            </div>
        </form>
    </div>
</template>

<script>
    export default {
        data: function () {
            return {
                profiles: []
            }
        },
        methods: {
            getProfiles() {
                axios.get('/api/profile')
                    .then((res) => {
                        this.profiles = res.data;
                    });
            }
        },
        mounted() {
            this.getProfiles();
        }
    }
</script>

別コンポーネントでも同コンポーネント内同様、
「定義した箱+テーブルのカラム名」で表示ができた。
今回はreturn user''や return profile[]のこと。


参考:Laravel + vue.jsでシンプルファイルアップロード
https://reffect.co.jp/vue/vue-js-laravel-file-upload

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0