Create Custom Trait to Resize and Upload Image in Laravel

Hello Artisan,

In this Laravel 8 intervention image resize tutorial, I will show you, How to resize images before uploading examples in Laravel. You know that Laravel intervention image upload, we use intervention/image package. In this Laravel 8 resize the image before upload tutorial, I will create a custom trait to resize the image. From that custom trait, I will create a helper method to get an upload file URL and we will resize an image in that method. 

You know that if we create a helper method to upload and resize images using the image intervention package, we can use this same method everywhere to upload and resize images in Laravel. No need to write the same or repeated code everywhere. So you will learn laravel 8 compress image before upload from this Larave resize images example.

So if you still don't know how to resize image in Laravel 8 then this example is going to be the perfect example for you. You know that PHP Laravel intervention is a very popular package for resizing images and it provides a resize function that will take three parameters. three parameters are width, height, and a callback function. the callback function is optional.

resize-image-and-upload-laravel

 

Step 1: Download Laravel

To create Laravel 8 resize image tutorial, we need a fresh Laravel app. So run the below command to download a Laravel application.

composer create-project --prefer-dist laravel/laravel blog

 

Step 2: Install Intervention Package

As we need to resize images before uploading to Laravel, we need this image intervention package. So run the below command to install it.

composer require intervention/image

 

Now we need to add the below code to the following path and alias in config/app.php file so open that file and add the below code.

config/app.php

return [

    ......

    $provides => [

        ......

        ......,

        Intervention\Image\ImageServiceProvider::class

    ],

    $aliases => [

        .....

        .....,

        'Image' => Intervention\Image\Facades\Image::class

    ]

]

 

Now we are completely ready to use this image resizing package in our Laravel application.

 

Step 3: Create Model

As are going to create an image upload system in Laravel with image resizing, so we need a table with an image field. So run below command to create a model:

php artisan make:model Product -m

 

Now update product migration file like below:

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

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->mediumText('description')->nullable()->default('This is product description');
            $table->integer('price');
            $table->integer('qty');
            $table->string('image')->nullable();
            $table->timestamps();

        });
    }

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

 

And update product models like:

app\Models\Product.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasFactory;

    protected $fillable = [
        'name', 'price', 'qty', 'image'
    ];

}

 

Now run php artisan migrate command to migrate the database.

 

Step 4: Create Custom Helper Trait

In this step, we will create a custom helper trait to upload an image in Laravel with image resizing. So create a trait like below:

app\Helper\File.php

namespace App\Helper;

use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;

Trait File
{   
    public $public_path = "/public/uploadedImages/";
    public $storage_path = "/storage/uploadedImages/";

    public function file( $file, $path, $width, $height ) : string
    {
       if ( $file ) {

           $extension       = $file->getClientOriginalExtension();
           $file_name       = $path.'-'.Str::random(30).'.'.$extension;
           $url             = $file->storeAs($this->public_path,$file_name);
           $public_path     = public_path($this->storage_path.$file_name);
           $img             = Image::make($public_path)->resize($width, $height);
           $url             = preg_replace( "/public/", "", $url );
           return $img->save($public_path) ? $url : '';
       }
    }
}

 

Step 5: Create Route

In this step, we need a route to store our resizing image into a database and storage folder in Laravel. So add the below route:

routes/web.php

Route::get('/product/{id}', 'ProductController@index');
Route::post('/product', 'ProductController@store')->name('store');

 

Step 6: Create Controller

In this step, we have to create a productController.php file to create the above method to upload and resize in Laravel.

app\Http\Controllers\productController.php

namespace App\Http\Controllers;

use App\Helper\File;
use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{   
   use File;

   public function index()
   {
      return view('welcome');
   }

   public function store(Request $request){

      if( $file = $request->file('image') ) {
            $path = 'products/images';
            $url = $this->file($file,$path,300,400);
        }

        $product = new Product();
        $product->name = $request->name;
        $product->description = $request->description;
        $product->price = $request->price;
        $product->qty = $request->qty;
        $product->image = $url;

        if($product->save()){
            return back()->with('message','Product Created Successfully!')
        }
   }
}

 

Step 7: Create Blade File

In this step, we have to create a welcome.blade.php file to create an HTML form to save an image with resizing in Laravel. So create it.

resources/views/welcome.blade.php

 

Almost all are set to go. Now we have to run the below command before storing data. run php artisan storage:link to link storage to the public directory. Now you can test by starting the server by running the php artisan serve command.

 

Recommended: Encrypt File Before Uploading and Download Example in Laravel

 

Now after storing and fetching the image, you can print it in your blade file like:

 

Read also: Upload Large CSV File using Queue Job Batching in Laravel

 

Hope this Laravel resize image before upload tutorial will help you.

 

Facebook Github
A web enthusiastic, a self-motivated full-stack software engineer from Dhaka, Bangladesh with experience in developing applications using Laravel , React and Vue js