Laravel File Upload & Storage (Beginner Friendly)

riazul-islam
Riazul Islam
Published on Feb, 14 2026 2 min read 0 comments
image

📌 Why File Upload & Storage is Important

Almost every web application requires file uploads:

  • Profile pictures
  • Documents
  • Images or videos for blogs
  • Reports for admin dashboards

Laravel makes file upload and storage easy and secure.

⚙️ Step 1: Configure Filesystem

Laravel uses Filesystem API to handle files. Default configuration is in:

config/filesystems.php

Common disks:

  • local → storage/app
  • public → storage/app/public (accessible via URL)
  • s3 → cloud storage

Create symbolic link to make public files accessible:

php artisan storage:link

🔹 Step 2: Create File Upload Form

Example: Uploading images

resources/views/upload.blade.php:

@extends('layouts.app')

@section('content')
<h1>Upload Image</h1>
@if(session('success'))
    <div>{{ session('success') }}</div>
@endif
<form action="{{ route('upload.store') }}" method="POST" enctype="multipart/form-data">
    @csrf
    <input type="file" name="image">
    <button type="submit">Upload</button>
</form>
@endsection

Key Points:

  • enctype="multipart/form-data" → required for file uploads
  • @csrf → security token

🔹 Step 3: Create Route & Controller

Route

routes/web.php:

use App\Http\Controllers\UploadController;

Route::get('/upload', [UploadController::class,'create']);
Route::post('/upload', [UploadController::class,'store'])->name('upload.store');

Controller

php artisan make:controller UploadController

app/Http/Controllers/UploadController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class UploadController extends Controller
{
    public function create() {
        return view('upload');
    }

    public function store(Request $request) {
        $request->validate([
            'image' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048'
        ]);

        $path = $request->file('image')->store('images','public');

        return back()->with('success','Image uploaded successfully! Path: '.$path);
    }
}
  • store('images', 'public') → stores in storage/app/public/images
  • Validation ensures file type and size restrictions

🔹 Step 4: Display Uploaded Images

<img src="{{ asset('storage/'.$path) }}" alt="Uploaded Image" width="200">
  • asset('storage/...') → generates public URL

🔹 Step 5: Handling File Deletion

Storage::disk('public')->delete($path);
  • Removes the file from storage/app/public

🔹 Step 6: Advanced: Multiple File Uploads

<input type="file" name="images[]" multiple>

Controller:

foreach($request->file('images') as $image) {
    $image->store('images','public');
}
  • Loops through files and stores each one

🔹 Step 7: Storing Files in Cloud (S3 Example)

Set up .env:

FILESYSTEM_DRIVER=s3
AWS_ACCESS_KEY_ID=your_key
AWS_SECRET_ACCESS_KEY=your_secret
AWS_DEFAULT_REGION=your_region
AWS_BUCKET=your_bucket

Then store:

$path = $request->file('image')->store('images', 's3');
$url = Storage::disk('s3')->url($path);
  • Generates public URL for cloud files

📌 Key Takeaways

This week you learned:

  • How to configure Laravel filesystem
  • How to create file upload forms
  • How to validate uploaded files
  • How to store files locally or in public folder
  • How to handle multiple file uploads and deletion
  • Optional: Store files in cloud storage (S3)

 

0 Comments