This tutorial will cover Laravel file uploading concepts:
If you are a beginner in Laravel development, you must check out our detailed tutorial on Building Laravel CRUD Web Application.
In this Laravel file upload example tutorial, we will generate two routes one for creating a form with getting method and another route for file uploading or post file upload data.
We develop a simple form using Bootstrap and its Form UI component.
It will allow us to choose a file that needs to be uploaded in the storage > public > uploads folder. We will also configure the database model and store the file path along with its name in the MySQL database.
Open command-line tool and execute the following command to create a Laravel project from scratch.
composer create-project laravel/laravel --prefer-dist laravel-file-upload
Get into the freshly installed laravel project’s directory.
cd laravel-file-upload
You can use MAMP or XAMPP as a local web server for uploading files to storage in laravel. Define a database name in MySQL and add the correct configuration in .env
file.
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=
Create a Model in laravel, It holds the data definition that interacts with the database.
php artisan make:model File -m
Next, open migration file for defining the table values in the database for storing the uploaded file’s information. Go to database/migrations/timestamp_create_files_table file and define the table values.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFilesTable extends Migration
{
public function up()
{
Schema::create('files', function (Blueprint $table) {
$table->id();
$table->string('name')->nullable();
$table->string('file_path')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('files');
}
}
Now, add the $fillable property in the File model. Open app/Models/File.php file and place the following code.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class File extends Model
{
use HasFactory;
protected $fillable = [
'name',
'file_path'
];
}
Now, you are all set to run the migration. You can also see the update in the mysql database.
php artisan migrate
Go to routes/web.php and create two routes. First, the route handles the form creation, and the second route stores the file in the MySQL database.
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\FileUpload;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/upload-file', [FileUpload::class, 'createForm']);
Route::post('/upload-file', [FileUpload::class, 'fileUpload'])->name('fileUpload');
Create a file uploading controller; we define the business logic for uploading and storing files in Laravel.
Execute the command to create the controller.
php artisan make:controller FileUpload
Open app/Http/Controllers/FileUpload.php file, and we need to define the two methods to handle the file upload.
The first method renders the view via FileUpload controller, and the fileUpload() method checks the validation, be it required, mime type or file size limitation.
This method also stores the file into storage/public/uploads folder and saves the file name and path in the database.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\File;
class FileUpload extends Controller
{
public function createForm(){
return view('file-upload');
}
public function fileUpload(Request $req){
$req->validate([
'file' => 'required|mimes:csv,txt,xlx,xls,pdf|max:2048'
]);
$fileModel = new File;
if($req->file()) {
$fileName = time().'_'.$req->file->getClientOriginalName();
$filePath = $req->file('file')->storeAs('uploads', $fileName, 'public');
$fileModel->name = time().'_'.$req->file->getClientOriginalName();
$fileModel->file_path = '/storage/' . $filePath;
$fileModel->save();
return back()
->with('success','File has been uploaded.')
->with('file', $fileName);
}
}
}
In this step, we will create a view along with the file uploading form.
Create resources\views\file-upload.blade.php file and place the following code inside of it.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<title>Laravel File Upload</title>
<style>
.container {
max-width: 500px;
}
dl, ol, ul {
margin: 0;
padding: 0;
list-style: none;
}
</style>
</head>
<body>
<div class="container mt-5">
<form action="{{route('fileUpload')}}" method="post" enctype="multipart/form-data">
<h3 class="text-center mb-5">Upload File in Laravel</h3>
@csrf
@if ($message = Session::get('success'))
<div class="alert alert-success">
<strong>{{ $message }}</strong>
</div>
@endif
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="custom-file">
<input type="file" name="file" class="custom-file-input" id="chooseFile">
<label class="custom-file-label" for="chooseFile">Select file</label>
</div>
<button type="submit" name="submit" class="btn btn-primary btn-block mt-4">
Upload Files
</button>
</form>
</div>
</body>
</html>
This code is responsible for showing file uploading form and also display the message based on the status.
To check the demo, execute the following command.
php artisan serve
Check the app on the following Url.
http://127.0.0.1:8000/upload-file
Finally, we have completed the Laravel File uploading tutorial.
If you want to learn how to get the current route's name, component pathname or…
React show and hide example. In this tutorial, we will show you how to step…
Tabs are one of the best UI elements for displaying multiple contents in a single…
In this tutorial, we will learn how to create a toast notification component in the…
Bootstrap offers tons of custom UI solutions. On top of that, it is easy to…
React js counter using the useReducer hook example. In this post, we will learn how…