This tutorial help to upload files using Laravel 9. We will create an HTML form view that upload file into the server and save path information into a MySQL table.
We will use MySQL and PHP 7 to create file upload functionality.
File Upload Using Laravel 9 and Mysql
Let’s create a new laravel application using laravel CLI. The Artisan is the command-line interface included with Laravel, If you have not yet created a Laravel application. Please create using the command below –
laravel new laravel_file_upload
Create Migration Table
These two options to create a MySQL table for laravel application, Either You will create a table into MySQL using SQL script or using migration, I prefer the migration option –
The uploads table SQL script:
CREATE TABLE `uploads` ( `id` int(10) UNSIGNED NOT NULL, `user_id` int(10) UNSIGNED NOT NULL, `group_id` int(10) UNSIGNED NOT NULL, `filename` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `extension` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `filesize` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `location` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Using Migration File in Laravel
We will create a migration file using the below command –
php artisan make:migration create_uploads_table --create=uploads
Now, open the file database/migrations/{{datetime}}_create_uploads_table.php
. We will add the below code inside the up()
method.
Schema::create('uploads', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id'); $table->integer('group_id'); $table->string('filename'); $table->string('extension'); $table->string('filesize'); $table->string('location'); $table->timestamps(); });
Open a command line and run the below commandphp artisan migrate
The above command will create a table in the MySQL database.
Model File into Laravel
We will create FileUpload.php
into Models/
folder the file location would be app/Models/FileUpload.php
. Open the file and add the below code into this file.
//Models/FileUpload.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class FileUpload extends Model { /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'user_id', 'group_id', 'filename', 'extension', 'filesize', 'location' ]; }
Create Routes and View file into Laravel
We will create a view file to display the upload form into laravel. We will use the session to display upload success and error messages.
We will create a view file inside the resources/views folder. We will add below into uploads.blade.php
file.
@extends('layouts.backend') @section('title', 'Add Contacts') @section('content') <div> @include('flash::message') <!-- Start Page Content --> <div class="sms_heading"> <h3><i class="fa fa-at"></i> Add Contacts</h3> </div> @if ($message = Session::get('success')) <div class="alert alert-success alert-block"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>{{ $message }}</strong> </div> @endif <div class="tab-content"> <div role="tabpanel" class="tab-pane active" id="upload-contacts"> <form action="{{ route('upload-file', $group) }}" class="form-horizontal form-bordered" id="upload-contacts" method="post" enctype="multipart/form-data"> <input name="_token" type="hidden" value="{{ csrf_token() }}"> <div class="form-group"> <div class="col-xs-12 col-sm-9 col-md-6"> <input type="file" class="filestyle" id="filename" name="filename" data-buttontext="Browse"> </div> </div> <div class="form-actions fluid"> <div class="row"> <div class="col-md-12"> <div class="col-sm-12 col-md-12"> <button class="btn btn-info" type="submit"><i class="fa fa-upload"></i> Upload Contacts File</button> </div> </div> </div> </div> </form> </div> @if (count($errors) > 0) <div class="alert alert-danger"> <strong>Whoops!</strong> There were some problems with your input. <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif </div> <!-- End Page Content --> </div> @stop
Routes in Laravel 9
We will define routes in routes/web.php
file. This route path will use to upload files into the server.
Route::post('groups/{group}/contacts/upload', 'UploadContactsController')->name('upload-file');
Now, We will create UploadContactsController.php
file and define upload-file
method.
//App\Http\Controllers\Backend\UploadContactController.php namespace App\Http\Controllers\Backend; use App\Http\Requests\Backend\Contacts\UploadContactsRequest; use App\Http\Controllers\Controller; use App\Jobs\UploadContacts; use App\Models\FileUpload; use App\Models\Group; use Session; class UploadContactsController extends Controller { /** * Upload the contacts file * * @param App\Http\Requests\Backend\Contacts\UploadContactsRequest $request * @param App\Models\Group $group * @return \Illuminate\Http\Response */ public function __invoke(UploadContactsRequest $request, Group $group) { if ($request--->file('filename')->isValid()) { $fileUpload = new FileUpload; $fileUpload->user_id = auth()->user()->id; $fileUpload->group_id = $group->id; $fileUpload->filename = $request->file('filename')->hashName(); $fileUpload->extension = $request->file('filename')->extension(); $fileUpload->filesize = $request->file('filename')->getClientSize(); $fileUpload->location = $request->file('filename')->store('contact-files'); $fileUpload->save(); toastr()->success('Data has been saved successfully!'); flash()->success('Your file is currently being processed. You will be notified when done.'); //UploadContacts::dispatch($fileUpload, $group)->onQueue('file-uploads'); dispatch(new UploadContacts($fileUpload, $group))->onQueue('file-uploads'); } else { flash()->error('There was a problem uploading your file. Please try again.'); } return back(); } }
Now we will define the request class into Http\Request\Backend\Contact
. We will create UploadContactsRequest.php
file into this folder.
//App\Http\Requests\Backend\Contacts\UploadContactRequest.php <?php namespace App\Http\Requests\Backend\Contacts; use Illuminate\Foundation\Http\FormRequest; class UploadContactsRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { $mime_types = [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel', 'application/vnd.ms-excel.addin.macroenabled.12', 'application/vnd.ms-excel.sheet.binary.macroenabled.12', 'application/vnd.ms-excel.sheet.macroenabled.12', 'application/vnd.oasis.opendocument.spreadsheet', 'text/csv', 'text/plain' ]; return [ 'filename' =--> 'required|file|mimetypes:'.implode($mime_types,',').'|max:51200' ]; } }