Upload Gambar dengan Preview di Laravel 10 dan Fitur Dark Mode Toggle

Oleh Najwa Latifah di 25 Sep 2025 | 16:02
Najwa Latifah

Najwa Latifah

Siswa
Postingan: 1
Suka: 1
Anggota sejak: 19 Agt 2025

Najwa Latifah

2310631180143

5E

Framework


Upload Gambar dengan Preview di Laravel 10 


Pada eksplorasi mandiri Framework kali ini saya mengambil tema Upload Gambar dengan Preview selain itu saya juga menambah sedikit materi tentang Dark Mode Toggle di Blade Template.

Sebelum kita masuk ke pembahasan utama mengenai cara membuat fitur upload gambar dengan preview di Laravel 10, mari kita pahami dulu apa itu Framework.

Framework adalah kerangka kerja atau struktur konseptual yang menyediakan fondasi, standar, dan alat bantu untuk membangun aplikasi perangkat lunak, atau sistem dengan lebih cepat, terstruktur, dan efisien.

Nah, fitur Upload Gambar dengan Preview sendiri adalah sebuah fungsi yang memungkinkan pengguna untuk mengunggah gambar ke sistem, sekaligus melihat pratinjau (preview) dari gambar tersebut sebelum benar-benar disimpan. Fitur ini sangat berguna untuk memastikan file yang dipilih sudah sesuai, misalnya saat mengunggah foto profil, gambar produk, atau dokumen visual lainnya.
Mengapa fitur Upload Gambar dengan Preview penting?

1.  Meminimalisir kesalahan: Preview memudahkan pengguna untuk dapat melihat filenya sebelum di upload.

2. Meningkatkan kepuasan pengguna: Fitur ini memberi rasa aman dan nyaman karena pengguna dapat langsung melihat hasil pilihannya.

3. Lebih profesional dan modern: Aplikasi yang menyediakan preview gambar terlihat lebih interaktif, modern, dan sesuai standar aplikasi masa kini.

  • 4. Mendukung Berbagai Kebutuhan Aplikasi: Mulai dari upload foto profil, gambar produk, banner, hingga dokumen visual lain, semua bisa memanfaatkan fitur ini.


    Setelah mengetahui apa itu Framework dan kenapa fitur Upload Gambar dengan Preview penting sekarang kita akan masuk kecara pembuatannya

    Upload Gambar dengan Preview

    1. Buat projek Laravel 10

    Composer create-project laravel/laravel nama-proyek

    2. Buat database 

    Masuk ke phpMyAdmin, kemudian buat database baru

    3. Atur koneksi database pada projek laravel kamu di .env, sambungkan ke database yang sudah kamu buat tadi

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=laravel
    DB_USERNAME=root
    DB_PASSWORD=

    4. Buat controller

    php artisan make:controller ImageController

  • 5. Masuk ke ImageController yang sudah dibuat tadi
    app/http/controller/ImageController
    <?php

    namespace App\Http\Controllers;

    use Illuminate\Http\Request;

    class ImageController extends Controller
    {
        public function index () {
             return view('image-upload');
        }

        public function store(Request $request)
        {
            $validated = $request->validate([
                'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
            ]);

            $file = $request->file('image');
            $filename = time().'.'.$file->extension();
            $file->move(public_path('images'), $filename);

            return back()
                ->with('success', 'Gambar berhasil diupload')
                ->with('image', $filename);
        }
    }

  • 5. Tambahkan Routes
    Masuk ke routes/web.php
    <?php

    use Illuminate\Support\Facades\Route;

    Route::get('/', function () {
        return view('welcome');
    });

    use App\Http\Controllers\ImageController;

    Route::get('/image-upload', [ImageController::class, 'index']);
    Route::post('/image-upload', [ImageController::class, 'store'])->name('image.store');

  • 6. Buat blade views dengan preview

    reseurce/views kemudian buat file baru image-upload.blade.php

    masuk ke file yang sudah dibuat tadi

    reseurce/views/image-upload.blade.php

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Upload Gambar dengan Preview</title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">

        <style>
            /* Dark Mode Styles */
            body.dark-mode {
                background-color: #121212;
                color: #e0e0e0;
            }

            .dark-mode .card,
            .dark-mode .alert,
            .dark-mode .form-control {
                background-color: #1e1e1e;
                color: #fff;
            }

            .dark-mode .btn-primary {
                background-color: #3f51b5;
                border-color: #3f51b5;
            }

            .dark-mode .btn-secondary {
                background-color: #666;
                border-color: #666;
            }
        </style>
    </head>
    <body>
    <div class="container mt-5">

        <div class="d-flex justify-content-between align-items-center mb-3">
            <h2>Upload Gambar dengan Preview</h2>
            <button id="toggle-dark" class="btn btn-secondary">🌙 Dark Mode</button>
        </div>

        @if(session('success'))
            <div class="alert alert-success">
                {{ session('success') }}
            </div>
            <div class="mb-3">
                <strong>Gambar:</strong><br>
                <img src="{{ asset('images/' . session('image')) }}" width="200px">
            </div>
        @endif

        <form action="{{ route('image.store') }}" method="POST" enctype="multipart/form-data">
            @csrf

            <div class="mb-3">
                <label for="image" class="form-label">Pilih Gambar:</label>
                <input type="file" name="image" id="imageInput"
                       class="form-control @error('image') is-invalid @enderror">
                @error('image')
                    <div class="text-danger">{{ $message }}</div>
                @enderror
            </div>

            <div class="mb-3">
                <img id="previewImage" src="#" alt="Preview Gambar" style="display: none; max-width: 300px; margin-top:10px;">
            </div>

            <button type="submit" class="btn btn-primary">Upload</button>
        </form>
    </div>

    <script>
        // Preview gambar sebelum upload
        document.getElementById('imageInput').addEventListener('change', function(event) {
            const [file] = this.files;
            if (file) {
                const preview = document.getElementById('previewImage');
                preview.src = URL.createObjectURL(file);
                preview.style.display = 'block';
            }
        });

        // Toggle Dark Mode
        const toggleBtn = document.getElementById('toggle-dark');
        toggleBtn.addEventListener('click', () => {
            document.body.classList.toggle('dark-mode');
            toggleBtn.textContent =
                document.body.classList.contains('dark-mode') ? "☀️ Light Mode" : "🌙 Dark Mode";
           
            // Simpan preferensi ke localStorage
            localStorage.setItem('dark-mode', document.body.classList.contains('dark-mode'));
        });

        // Load preferensi dari localStorage
        if (localStorage.getItem('dark-mode') === 'true') {
            document.body.classList.add('dark-mode');
            toggleBtn.textContent = "☀️ Light Mode";
        }
    </script>

    </body>
    </html>

    nah disini saya menambahkan fitur darkmode agar pengguna dapat menyesuaikan tampilan sesuai dengan kenyamanan pengguna


    Kode untuk Blade View dengan Preview

    <div class="container mt-5">

        <div class="d-flex justify-content-between align-items-center mb-3">
            <h2>Upload Gambar dengan Preview</h2>
            <button id="toggle-dark" class="btn btn-secondary">🌙 Dark Mode</button>
        </div>

        @if(session('success'))
            <div class="alert alert-success">
                {{ session('success') }}
            </div>
            <div class="mb-3">
                <strong>Gambar:</strong><br>
                <img src="{{ asset('images/' . session('image')) }}" width="200px">
            </div>
        @endif

        <form action="{{ route('image.store') }}" method="POST" enctype="multipart/form-data">
            @csrf

            <div class="mb-3">
                <label for="image" class="form-label">Pilih Gambar:</label>
                <input type="file" name="image" id="imageInput"
                       class="form-control @error('image') is-invalid @enderror">
                @error('image')
                    <div class="text-danger">{{ $message }}</div>
                @enderror
            </div>

            <div class="mb-3">
                <img id="previewImage" src="#" alt="Preview Gambar" style="display: none; max-width: 300px; margin-top:10px;">
            </div>

            <button type="submit" class="btn btn-primary">Upload</button>
        </form>
    </div>

    <script>
        // Preview gambar sebelum upload
        document.getElementById('imageInput').addEventListener('change', function(event) {
            const [file] = this.files;
            if (file) {
                const preview = document.getElementById('previewImage');
                preview.src = URL.createObjectURL(file);
                preview.style.display = 'block';
            }
        });


    Kode CSS untuk Dark Mode

    <style>
            /* Dark Mode Styles */
            body.dark-mode {
                background-color: #121212;
                color: #e0e0e0;
            }

            .dark-mode .card,
            .dark-mode .alert,
            .dark-mode .form-control {
                background-color: #1e1e1e;
                color: #fff;
            }

            .dark-mode .btn-primary {
                background-color: #3f51b5;
                border-color: #3f51b5;
            }

            .dark-mode .btn-secondary {
                background-color: #666;
                border-color: #666;
            }
        </style>

    Kode untuk tombol toggle

    <button id="toggle-dark" class="btn btn-secondary">🌙 Dark Mode</button>
    Kode untuk JavaScript toggle
        // Toggle Dark Mode
        const toggleBtn = document.getElementById('toggle-dark');
        toggleBtn.addEventListener('click', () => {
            document.body.classList.toggle('dark-mode');
            toggleBtn.textContent =
                document.body.classList.contains('dark-mode') ? "☀️ Light Mode" : "🌙 Dark Mode";
           
            // Simpan preferensi ke localStorage
            localStorage.setItem('dark-mode', document.body.classList.contains('dark-mode'));
        });

        // Load preferensi dari localStorage
        if (localStorage.getItem('dark-mode') === 'true') {
            document.body.classList.add('dark-mode');
            toggleBtn.textContent = "☀️ Light Mode";
        }

    7. Jalankan dan uji fitur yang sudah kita buat

    php artisan serve



    Fitur Upload Gambar dengan Preview di Laravel 10 memudahkan pengguna melihat gambar sebelum diunggah, sehingga lebih aman dan praktis. Ditambah dengan Dark Mode Toggle, aplikasi jadi lebih modern, interaktif, dan nyaman digunakan sesuai preferensi pengguna.


    Untuk tutorial berbentuk video kalian bisa lihat disini: https://youtu.be/S0eauzMtm8k 

    25 Sep 2025 | 16:02
    1 Suka

    Laporkan

    Silakan jelaskan laporan secara singkat dan jelas.