Laraver 5 Image upload to BLOB mysql

In this article, we will discuss Laravel 5 save image file JPG, PNG, etc. into MYSQL database with table column data type BLOB. A BLOB is a binary large object that can hold a variable amount of data it is a perfect solution to store images or PDF files in a database.

In my simple project, I’m using the logo file for the invoice propose.

Composer requirements.

composer require intervention/image

Database table.

We need to add two columns into `users` project table:

  • logo with data type blob
  • imageType with data type varchar(45)
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `logo` blob,
  `imageType` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `admins_email_unique` (`email`),
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Controller.

Required classes: Request, Image, Crypt, Auth, Hash, Session
Make sure that the classes are imported into Laravel project. If you are facing any issues with classes let me know I will provide you solution on how to install it.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Auth;
use Hash;
use Illuminate\Support\Facades\Crypt;
use Image;
use Session;

public function save_inv(Request $request)
 {
        try{
            $user = Auth::user(); 
            if( $request->hasFile('logo')) {
                $file = $request->file('logo');
                $imageType = $file->getClientOriginalExtension();
                
                $image_resize = Image::make($file)->resize( null, 90, function ( $constraint ) {
                                                                        $constraint->aspectRatio();
                                                                    })->encode( $imageType );            

                $user->logo = $image_resize;
                $user->imageType = $imageType;
            }
                
                $user->save();

            Session::put('success','Profile info updated.');
            return back();
        }
        catch(\Illuminate\Database\QueryException $ex){ 
            Session::put('failed', str_limit($ex->getMessage(), 90));
            return str_limit($ex->getMessage(), 90);
        }
}

Routing.

We need to create POST route to the controller with a function that will save the image file into a database.

Route::post('/profile_update', 'ProfileController@save_inv');

View.

The View HTML Form will display the image if exists in the database

{{ "data:image/" .Auth::user()->imageType. ";base64," .base64_encode( Auth::user()->logo ) }}

and upload a new file into the database using input type=”file”

@if($message = Session::get('success'))
<div class="alert alert-info alert-transparent">
    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
    <i class="icon-verified_user"></i><strong>Success! </strong> {{ $message }}
</div>
@elseif($message = Session::get('failed'))
<div class="alert alert-danger alert-transparent">
    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
    <i class="icon-verified_user"></i><strong>Failed! </strong> {{ $message }}
</div>
@endif
{!! Session::forget('success') !!}
{!! Session::forget('failed') !!}

<div class="tab-pane" id="basic-info-tab-pane2" role="tabpanel" aria-labelledby="basic-info-tab2">
    <div class="col-12 card p-6" style="margin-top: 10px;">
        <form action="{{ url('profile_update') }}" method="post" enctype="multipart/form-data"> 
            {{csrf_field()}}
            <div class="form-group">
                @if( Auth::user()->logo )
                    <img src="{{ "data:image/" .Auth::user()->imageType. ";base64," .base64_encode( Auth::user()->logo ) }}">
                @endif
                <input type="file" class="form-control-file" id="logo" name="logo" accept="image/png, image/jpeg">
                <label for="logo">Reseller Logo</label>
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-secondary" title="Save Profile Information" style="margin-bottom: 20px;">Save</button>
            </div>
        </form>
    </div>
</div>

PHP settings for MissingDependencyException.

Intervention \ Image \ Exception \ MissingDependencyException
PHP Fileinfo extension must be installed/enabled to use Intervention Image.

CPANEL

Login to your cpanel: Click Select PHP Version

select-php-version-in4system

Choose PHP Selector | extensions

php-selector-in4system

Insert the code below to index.php to check PHP Fileinfo extension installed/enabled.

PHP-fileinfo-enable-in4system

If you see this you have installed PHP Fileinfo extension php successfully otherwise you can create support tickets for hosting.

Localhost

in php.ini check if you have enabled:

extension=fileinfo

Feel free to comment if any query.

Related articles

Laravel 5 Custom Authentication Setup

In this article, we will focus on how to...

Laravel 5 Export To PDF Using Laravel-Dompdf

In this article, we will discuss Laravel 5 Export...

Laravel 5 Zipp invoices files using zipper

Requirements Install chumper/zipper Package composer require chumper/zipper Config define providers and...

Laravel 5 OAuth2 for REST API

In this article, I will show you how to...

Case Studies

Psycholog dziecięcy Olsztyn
Search engine optimization

SEO for Child Psychologist Olsztyn

In this case study, we explore how we improved the online presence of a child psychologist in Olsztyn through an effective SEO strategy. The...
Branding & visual design

Web3 DeFi Platform

A clothing brand wanted to launch a new e-commerce website that would allow customers to browse and purchase their products online. We developed a...
Content & copywriting

iFlow Attendance App

A clothing brand wanted to launch a new e-commerce website that would allow customers to browse and purchase their products online. We developed a...