Welcome guys! In this Laravel 11 crud with image upload guide, we will show you how to create crud (create, read, update, delete) operation with an image upload in laravel 11 applications.
If you want to create a post, category, job, vacancy, inventory, slider, carousel etc crud application in Laravel and also add image upload feature to it, Laravel has provided many built-in methods for the same, which you can use, and it can be done easily in just a few minutes.
In this example guide, we will create a vacancies crud operation application with an image upload feature in laravel 11 applications.
Steps for Laravel 11 CRUD with Image Upload Tutorial Example
Here are:
Step 1 – Laravel 11 Installation
If you do not have installed laravel 11 on your server, Just run the composer create-project --prefer-dist laravel/laravel FirstLaravelCRUD
on cmd or terminal window to download & install latest laravel 11 application setup into your server:
composer create-project --prefer-dist laravel/laravel FirstLaravelCRUD
Step 2 – Database Configuration
Now, open the .env
file from the laravel application root directory and configure your database details; Something like this:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=name_of_your_database DB_USERNAME=name_of_your_database_user DB_PASSWORD=password_of_your_database_user
Step 3 – Creating Migration and Model File
Run the php artisan make:model Vacancy -m
command on cmd or terminal window to create migration and model file for crud operation with image upload application:
php artisan make:model Vacancy -m
Now open create_vacancies_table.php file from /database/migrations/ folder and update the up() function to create table into your database:
public function up(): void { Schema::create('vacancies', function (Blueprint $table) { $table->id(); $table->string('title'); $table->string('description'); $table->string('image'); $table->timestamps(); }); }
Run the php artisan migrate
command on cmd to create tables into your configured database with laravel applications:
php artisan migrate
Step 4 – Creating CRUD with Image Upload Routes
Open web.php file from routes folder, and create add,edit,delete and list routes for the crud application in it; something like this:
use App\Http\Controllers\VacancyCRUDController; Route::get('vacancies', [VacancyCRUDController::class, 'index']); Route::get('add-vacancy', [VacancyCRUDController::class, 'create']); Route::post('save-vacancy', [VacancyCRUDController::class, 'store']); Route::get('edit/{id}', [VacancyCRUDController::class, 'edit']); Route::post('update', [VacancyCRUDController::class, 'update']); Route::get('delete/{id}', [VacancyCRUDController::class, 'destroy']);
Step 5 – Creating CRUD Operation Methods in Controller
Run php artisan make:controller VacancyCRUDController
command on cmd to create controller file:
php artisan make:controller VacancyCRUDController
Now, open VacancyCRUDController.php
file from app/http/controllers folder and create some methods into it to handle crud operation with database; something like this:
<?php namespace App\Http\Controllers; use App\Models\Vacancy; use Illuminate\Http\Request; class VacancyCRUDController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $data['vacancies'] = Vacancy::orderBy('id','desc')->paginate(5); return view('index', $data); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { return view('create'); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $request->validate([ 'title' => 'required', 'image' => 'required|image|mimes:jpg,png,jpeg,gif,svg|max:2048', 'description' => 'required' ]); $imageName = $request->file('image')->getClientOriginalName(); $request->file('image')->storeAs('public/images', $imageName); $Vacancy = new Vacancy; $Vacancy->title = $request->title; $Vacancy->description = $request->description; $Vacancy->image = $imageName; $Vacancy->save(); return redirect('vacancies') ->with('success','Vacancy has been created successfully.'); } /** * Show the form for editing the specified resource. * * @param \App\Vacancy $Vacancy * @return \Illuminate\Http\Response */ public function edit(Request $request, $id) { $data['vacancy'] = Vacancy::find($id); return view('edit', $data); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param \App\Vacancy $Vacancy * @return \Illuminate\Http\Response */ public function update(Request $request) { $request->validate([ 'title' => 'required', 'description' => 'required', ]); $id = $request->id; $Vacancy = Vacancy::find($id); // Check if a new image file was uploaded if ($request->hasFile('image')) { // Delete the old image file if it exists if ($Vacancy->image) { \Storage::delete('public/images/' . $Vacancy->image); } // Store the new image file $imageName = $request->file('image')->getClientOriginalName(); $request->file('image')->storeAs('public/images', $imageName); $Vacancy->image = $imageName; } $Vacancy->title = $request->title; $Vacancy->description = $request->description; $Vacancy->save(); return redirect('vacancies') ->with('success','Vacancy has been updated successfully.'); } /** * Remove the specified resource from storage. * * @param \App\Vacancy $Vacancy * @return \Illuminate\Http\Response */ public function destroy(Request $request, $id) { $Vacancy = Vacancy::where('id',$id)->delete(); return redirect('vacancies') ->with('success','Vacancy has been deleted successfully.'); } }
Step 6 – Create CRUD Views File
Go to resources/views folder and, and then create index.blade.php
, create.blade.php
and edit.blade.php
files.
Now, open index.blade.php file and create list table in it to show a list vancancies from database in it; something like this:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Laravel 11 CRUD and Image Upload Example Tutorial - Tutsmake.com</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> </head> <body> <div class="container mt-2"> <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2>Laravel 11 CRUD and Image Upload Example Tutorial - Tutsmake.com</h2> </div> <div class="pull-right mb-2"> <a class="btn btn-success" href="{{ url('add-vacancy') }}"> Create Vacancy</a> </div> </div> </div> @if ($message = Session::get('success')) <div class="alert alert-success"> <p>{{ $message }}</p> </div> @endif <table class="table table-bordered"> <tr> <th>S.No</th> <th>Title</th> <th>Image</th> <th>Description</th> <th width="280px">Action</th> </tr> @foreach ($vacancies as $vc) <tr> <td>{{ $vc->id }}</td> <td>{{ $vc->title }}</td> <td><img src="{{ asset('storage/images/'.$vc->image) }}" alt="Your Image" width="100px" height="100px"></td> <td>{{ $vc->description }}</td> <td> <form action="{{ url('delete/'.$vc->id) }}" method="get"> <a class="btn btn-primary" href="{{ url('edit/'.$vc->id) }}">Edit</a> @csrf @method('get') <button type="submit" class="btn btn-danger">Delete</button> </form> </td> </tr> @endforeach </table> {!! $vacancies->links() !!} </body> </html>
Next open create.blade.php
file and create add vacancy form in it, to create a add vacancy in database; Something like this:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Image Upload with Crud in Laravel 11 - Tutsmake.com</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> </head> <body> <div class="container mt-2"> <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2>Laravel 11 CRUD Operation Example Tutorial - Tutsmake.com</h2> </div> <div class="pull-left mb-2"> <h2>Add Vacancy</h2> </div> <div class="pull-right"> <a class="btn btn-primary" href="{{ url('vacancies') }}"> Back</a> </div> </div> </div> @if(session('status')) <div class="alert alert-success mb-1 mt-1"> {{ session('status') }} </div> @endif <form action="{{ url('save-vacancy') }}" method="POST" enctype="multipart/form-data"> @csrf <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Title:</strong> <input type="text" name="title" class="form-control" placeholder="Title"> @error('title') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Description:</strong> <input type="text" name="description" class="form-control" placeholder="Description"> @error('description') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Vacancy Poster Image:</strong> <input type="file" name="image" class="form-control"> @error('image') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-6 col-sm-6 col-md-6 mt-2"> <button type="submit" class="btn btn-primary ml-3">Submit</button> </div> </div> </form> </body> </html>
Now, Open edit.blade.php
file and create edit vacancy form in it to edit vacancy data from database; something like this:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Laravel 11 Image Upload with CRUD Operation - Tutsmake.com</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> </head> <body> <div class="container mt-2"> <div class="row"> <div class="col-lg-12 margin-tb"> <div class="pull-left"> <h2>Laravel 11 Image Upload with CRUD Operation Example Tutorial - Tutsmake.com</h2> </div> <div class="pull-left"> <h2>Edit vacancy </h2> </div> <div class="pull-right"> <a class="btn btn-primary" href="{{ url('vacancies') }}" enctype="multipart/form-data"> Back</a> </div> </div> </div> @if(session('status')) <div class="alert alert-success mb-1 mt-1"> {{ session('status') }} </div> @endif <form action="{{ url('update') }}" method="POST" enctype="multipart/form-data"> @csrf <input type="hidden" name="id" value="{{ $vacancy->id }}"> <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Title:</strong> <input type="text" name="title" value="{{ $vacancy ->title }}" class="form-control" placeholder="please enter title"> @error('title') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Description:</strong> <input type="text" name="description" value="{{ $vacancy ->description }}" class="form-control" placeholder="Please enter description"> @error('description') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Vacancy Poster Image:</strong> <input type="file" name="image" class="form-control"> <br> <img src="{{ asset('storage/images/'.$vacancy->image) }}" alt="Your Image" width="100px" height="100px"> @error('image') <div class="alert alert-danger mt-1 mb-1">{{ $message }}</div> @enderror </div> </div> <div class="col-xs-6 col-sm-6 col-md-6 mt-2"> <button type="submit" class="btn btn-primary ml-3">Submit</button> </div> </div> </form> </div> </body> </html>
Step 7 – Run and Test Application
Run php artisan serve command on cmd to start this application server, and you can test it on your browser:
php artisan serve
Now, open your browser and type the following URL into it for testing:
http://127.0.0.1:8000/vacancies
Conclusion
We hope that with the help of the example tutorial guide you have learned how to create Image Upload feature with Laravel 11 CRUD Operation application.