Laravel 9 Vue 3 Image Upload Example

    In this article, we will see the laravel 9 vue 3 image upload example. Here we will learn vue 3 image upload using vite in laravel 9. Also, we will use laravel breeze, inertia js, vite, and tailwind CSS to create a vue js image upload example in laravel 9.

    Vite is a modern frontend build tool that provides an extremely fast development environment and bundles your code for production. Vite has replaced Laravel Mix in new Laravel installations.

    So, let's see laravel vue image upload and image upload in vue js laravel 9.

Vue 3 Image Upload Using Vite In Laravel 9

    Step 1: Install Laravel 9

    Step 2: Create Auth with Breeze

    Step 3: Create Model and Migration

    Step 4: Create Routes

    Step 5: Create Controller

    Step 6: Create Vue Page

    Step 7: Run Vue Laravel Application

Step 1: Install Laravel 9

    In this step, we will install the laravel 9 application using the following command.

composer create-project laravel/laravel vue-laravel-image-upload
Read Also: Laravel 9 Ajax File Upload With Progress Bar
Step 2: Create Auth with Breeze

    Now, we will install breeze using the composer command.

composer require laravel/breeze --dev

    After installing laravel breeze, we will create a login, and register using the vue js.

php artisan breeze:install vue

    Now, we will install the node package using the following command.

npm install

    Run vite using the following command.

npm run dev

    Also, we will migrate the default table into the database using the following command.

php artisan migrate
Step 3: Create Model and Migration

    In this step, we will create migration and add fields in migration. Also, we will create a model for the same.

php artisan make:migration create_files_table

    Add fields name to the migration file. 

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('files', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('name');
            $table->timestamps();
        });
    }
  
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('files');
    }
};

    Run the below command and migrate the table.

php artisan migrate

    Now, we will create a File.php model using the following command.

php artisan make:model File

    App/Models/File.php

namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;
  
class File extends Model
{
    use HasFactory;
  
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'title', 'name'
    ];
  
    /**
     * Get the user's first name.
     *
     * @return \Illuminate\Database\Eloquent\Casts\Attribute
     */
    protected function name(): Attribute
    {
        return Attribute::make(
            get: fn ($value) => url('uploads/'.$value),
        );
    }
}
Read Also: How To Install Vue 3 In Laravel 9 With Vite
Step 4: Create Routes

    In this step, we will create routes in the web.php file.

    routes/web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\FileUploadController;
  
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
   
Route::get('file-upload', [FileUploadController::class, 'index'])->name('file.upload');
Route::post('file-upload', [FileUploadController::class, 'store'])->name('file.upload.store');
Step 5: Create Controller

    Now, we will create FileUploadController. Also, we will create an "uploads" folder in the public folder.

    app/Http/Controllers/FileUploadController.php

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Inertia\Inertia;
use Illuminate\Support\Facades\Validator;
use App\Models\File;
 
class FileUploadController extends Controller
{
    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function index()
    {
        $files = File::latest()->get();
        return Inertia::render('FileUpload', compact('files'));
    }
  
    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function store(Request $request)
    {
        Validator::make($request->all(), [
            'title' => ['required'],
            'file' => ['required'],
        ])->validate();
  
        $file_name = time().'.'.$request->file->extension();  
        $request->file->move(public_path('uploads'), $file_name);
    
        File::create([
            'title' => $request->title,
            'name' => $file_name
        ]);
    
        return redirect()->route('file.upload');
    }
}
Read Also: How To Implement Google Bar Chart In Vue Js
Step 6: Create Vue Page

    In this step, we will create FileUpload.vue file.

    resources/js/Pages/FileUpload.vue

<script setup>
import BreezeAuthenticatedLayout from '@/Layouts/Authenticated.vue';
import BreezeLabel from '@/Components/Label.vue';
import BreezeInput from '@/Components/Input.vue';
import { Head, Link, useForm } from '@inertiajs/inertia-vue3';

defineProps({
    files: Array,
});

const form = useForm({
    title: '',
    file: null
});

const submit = () => {
    form.post(route('file.upload.store'));
};

</script>

<template>
    <Head title="Dashboard" />

    <BreezeAuthenticatedLayout>
        <template #header>
            <h2 class="font-semibold text-xl text-gray-800 leading-tight">
                Laravel 9 Vue 3 Image Upload Example - Websolutionstuff
            </h2>
        </template>

        <div class="py-12">
            <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
                <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
                    <div class="p-6 bg-white border-b border-gray-200">
                        <form name="createForm" @submit.prevent="submit">
                                <div className="flex flex-col">
                                    <div className="mb-4">

                                        <BreezeLabel for="title" value="Title" />
                                        
                                        <BreezeInput 
                                            id="title" 
                                            type="text" 
                                            class="mt-1 block w-full" 
                                            v-model="form.title" 
                                            autofocus />

                                        <span className="text-red-600" v-if="form.errors.title">
                                            {{ form.errors.file }}
                                        </span>
                                    </div>

                                    <div className="mb-4">

                                        <BreezeLabel for="file" value="File" />
                                        
                                        <BreezeInput 
                                            id="file" 
                                            type="file" 
                                            class="mt-1 block w-full" 
                                            @input="form.file = $event.target.files[0]"
                                            autofocus />

                                        <span className="text-red-600" v-if="form.errors.title">
                                            {{ form.errors.file }}
                                        </span>
                                    </div>
                                </div>

                                <div v-if="form.progress" className="w-full bg-gray-200 rounded-full dark:bg-gray-700">
                                    <div className="bg-blue-600 text-xs font-medium text-blue-100 text-center p-0.5 leading-none rounded-full" :width="form.progress.percentage"> {{ form.progress.percentage }}%</div>
                                </div>
  
                                <div className="mt-4">
                                    <button
                                        type="submit"
                                        className="px-6 py-2 font-bold text-white bg-green-500 rounded"
                                    >
                                        Save
                                    </button>
                                </div>
                            </form>

                            <h1>Uploaded File List:</h1>
                            <table className="table-fixed w-full">
                                <thead>
                                    <tr className="bg-gray-100">
                                        <th className="px-4 py-2 w-20">No.</th>
                                        <th className="px-4 py-2">Title</th>
                                        <th className="px-4 py-2">Image</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    <tr v-for="file in files">
                                        <td className="border px-4 py-2">{{ file.id }}</td>
                                        <td className="border px-4 py-2">{{ file.title }}</td>
                                        <td className="border px-4 py-2">
                                            <img :src="file.name" width="200" />
                                        </td>
                                    </tr>
                                </tbody>
                            </table>

                    </div>
                </div>
            </div>
        </div>
    </BreezeAuthenticatedLayout>
</template>
Step 7: Run Vue Laravel Application

    Now, run vue 3 image upload using vite in the laravel 9 application.

php artisan serve

    Run the following command for vite.

npm run dev

    To build the application run the following command.

npm run build

    Open the below URL.

http://localhost:8000/file-upload

    You might also like:

Bình luận
Vui lòng đăng nhập để bình luận
Một số bài viết liên quan