Image and File Upload Tutorial in Laravel 11

 <?php


namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        $users = User::get();
        return view("file_upload", compact("users"));
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        $request->validate([
            "photo" => "required|mimes:png,jpg,jpeg|max:3000"
        ]);

        //Difference between getClientOriginalExtension() and extension() is that user can change extension so we can't get exact extension in case of getClientOriginalExtension() method
        // but extension() method will give exact extension so we mostly use extension() method
        // $file = $request->file("photo");
        // $extension = $file->getClientOriginalExtension();
        // $extension = $file->extension();
        // $extension = $file->hashName();
        // $extension = $file->getClientMimeType();    //getClientMimeType() method provides type of image/pdf/any_document
        // $extension = $file->getSize();  //getSize() method provides file size
        // return $extension;


        // Add image in Database First way
        $file = $request->file("photo");
        $path = $request->file("photo")->store("image", "public");
        User::create([
            "file_name" => $path
        ]);


        // Add image in Database Second way
        // $file = $request->file("photo");
        // $file->move(public_path("uploads"), $file->getClientOriginalName());
        // User::create([
        //     "file_name" => $file->getClientOriginalName()
        // ]);


        // Usage of store() method
        // $path = $request->file("photo")->store("image","local");    //First way
        // $path = $request->photo->store("image","local"); //second way
        // $path = $request->file("photo")->store("image","public");
        // return $path;


        // Usage of storeAs() method
        // getClientOriginalName() method will given original name of user file means User file name will not rename, it will remain as it is
        // $fileName = time() . "_" . $file->getClientOriginalName();
        // $path = $request->file("photo")->storeAs("image", $fileName, "public");
        // return $path;

        return redirect()->route("user.index")->with("status", "User Image Uploaded Successfully.");
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        $user = User::find($id);
        return view("file_update", compact("user"));
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        $user = User::find($id);

        if ($request->hasFile("photo")) {

            $image_path = public_path("storage/") . $user->file_name;

            if (file_exists($image_path)) {
                @unlink($image_path);
            }

            $path = $request->file("photo")->store("image", "public");

            $user->file_name = $path;
            $user->save();

            return redirect()->route("user.index")->with("status", "User Image Updated Successfully.");
        }
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        $user = User::find($id);
        $user->delete();

        $image_path = public_path("storage/") . $user->file_name;

        if (file_exists($image_path)) {
            @unlink($image_path);
        }

        return redirect()->route("user.index")->with("status", "User Image Data Deleted Successfully.");
    }
}
Above File is app\Http\Controllers\UserController File





Below File is app\Models\User File
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public $timestamps = true;
    protected $table = "users";
    protected $fillable = ["file_name"];
}





Below File is database\migrations\2024_12_19_061355_create_users_table File
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string("file_name");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};





Below File is resources\views\file_update.blade.php File
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>File Upload</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-12">
                <h2 class="text-center mb-2">Update : File Upload</h2>
            </div>
        </div>
        <form action="{{ route("user.update", $user->id) }}" method="POST" enctype="multipart/form-data">
            @csrf
            @method("PUT")
            <div class="row">
                <div class="col-3">
                    <img id="output" class="img-fluid img-thumnail" src="{{ asset("/storage/".$user->file_name) }}" alt="">
                </div>
                <div class="col-9">
                    <input type="file" onchange="document.querySelector('#output').src=window.URL.createObjectURL(this.files[0])" class="form-control @error("photo") is-invalid @enderror" name="photo" accept=".jpg,.png,.jpeg">
                    @error("photo")
                        <div class="alert alert-danger mb-1 mt-1">{{ $message }}</div>
                    @enderror
                </div>
                <div class="col-9 mt-5">
                    <input type="submit" value="Update" class="btn btn-sm btn-primary">
                </div>
            </div>
        </form>
    </div>
</body>
</html>





Below File is resources\web\file_upload.blade.php File
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>File Upload</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-12">
                <h2 class="text-center mb-2">File Upload</h2>
            </div>
        </div>
        <form action="{{ route("user.store") }}" method="POST" enctype="multipart/form-data">
            @csrf
            <div class="row">
                <div class="col-12">
                    <input type="file" class="form-control @error("photo") is-invalid @enderror" name="photo" accept=".jpg,.png,.jpeg">
                    @error("photo")
                        <div class="alert alert-danger mb-1 mt-1">{{ $message }}</div>
                    @enderror
                </div>
                <div class="col-12 mt-5">
                    <input type="submit" class="btn btn-sm btn-primary">
                </div>
            </div>
        </form>
        <div class="row mt-3">
            <div class="col-6">
                @if(session("status"))
                    <div class="alert alert-success">
                        {{ session("status") }}
                    </div>
                @endif
            </div>
        </div>
        <div class="row">
            @foreach($users as $data)
                <div class="col-2">
                    <img class="img-fluid img-thumbnail" src="{{ asset("/storage/". $data->file_name) }}" alt="">
                    <form action="{{ route("user.destroy", $data->id) }}" method="POST">
                        @csrf
                        @method("DELETE")
                        <button type="submit" class="btn btn-danger btn-sm mt-3 mb-3">Delete</button>
                    </form>
                    <a href="{{ route("user.edit", $data->id) }}" class="btn btn-warning">Update</a>
                </div>
            @endforeach
        </div>
    </div>
</body>
</html>





Below File is routes\web File
<?php

use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

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

Route::resource("user", UserController::class);







Comments

Popular posts from this blog

Eloquent Many to Many Relationship Tutorial in Laravel 11

Eloquent with JSON Data Columns Tutorial in Laravel 11

Blade Template Tutorial Three Template Inheritance in Laravel 11