Laravel में फ़ाइल अपलोड और स्टोरेज

Back to Home

Laravel में फ़ाइल अपलोड और स्टोरेज

Category: Laravel

 

Laravel का Storage / Filesystem API, Flysystem नामक लाइब्रेरी पर आधारित है, जिससे आप एक ही कोड से local disk, public disk, S3, FTP / SFTP, Google Cloud Storage आदि बहुत से स्टोरेज ड्राइव से काम कर सकते हैं।

 

1. सेटअप (Setup) kaise karte hain -

सबसे पहले, सुनिश्चित करें:

आपने एक Laravel प्रोजेक्ट बनाया है (उदाहरण: composer create-project laravel/laravel myapp)

.env में database आदि सेटअप हो

webserver (Apache / Nginx) और PHP काम कर रहा हो

इसके बाद एक महत्वपूर्ण कदम है:

Symbolic link बनाना — ताकि स्टोरेज / public फ़ाइलें वेब से एक्सेस हो सकें:

 

php artisan storage:link

यह कमांड storage/app/public को public/storage में लिंक कर देती है — जिससे ब्राउज़र से /storage/yourfile.jpg जैसे URLs से फाइल दिखाना आसान हो जाता है।

यदि आपने यह नहीं किया, तो आपके अपलोड की गई फाइलें वेब से inaccessible रहेंगी।

2. फ़ाइल अपलोड करना (Basics)

फ़ाइल अपलोड करने की प्रक्रिया इस प्रकार होती है:

a) HTML / Blade फ़ॉर्म

<form action="{{ route('file.upload') }}" method="POST" enctype="multipart/form-data">

    @csrf

    <label>अपनी फ़ाइल चुनें:</label>

    <input type="file" name="myfile">

    <button type="submit">Upload</button>

</form>

enctype="multipart/form-data" जरुरी है — बिना इसके फ़ाइल नहीं जाएगी।

@csrf टोकन सुरक्षा के लिए।

b) Route & Controller सेटअप

routes/web.php:

use App\Http\Controllers\FileController;

Route::get('/upload', [FileController::class, 'showForm'])->name('file.form');

Route::post('/upload', [FileController::class, 'upload'])->name('file.upload');

FileController.php:

 

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Storage;

class FileController extends Controller

{

    public function showForm()

    {

        return view('upload_form');

    }

    public function upload(Request $request)

    {

        // वैलिडेशन

        $request->validate([

            'myfile' => 'required|file|max:2048', // अधिकतम 2MB

        ]);

        if ($request->hasFile('myfile')) {

            $file = $request->file('myfile');

            // नाम बदलना (optional)

            $filename = time() . '_' . $file->getClientOriginalName();

            // फाइल स्टोर करना

            $path = $file->storeAs('uploads', $filename, 'public');

            // $path होगा uploads/filename.ext

            // यदि चाहते हो DB में path संग्रहीत करना

            // FileModel::create(['path' => $path, ...]);

            return back()->with('success', "फ़ाइल सफलतापूर्वक अपलोड हुई: $path");

        }

        return back()->withErrors(['myfile' => 'फ़ाइल अपलोड नहीं हुई']);

    }

}

c) क्या हो रहा है?

$request->hasFile('myfile') यह जाँचेगा कि यूज़र ने फ़ाइल भेजी है या नहीं

storeAs('uploads', $filename, 'public') — यह फाइल को storage/app/public/uploads में स्टोर करेगा

public यहाँ वह disk है, जैसा कि config/filesystems.php में परिभाषित है

3. स्टोरेज कॉन्फ़िगरेशन (Disks & config/filesystems.php)

Laravel में config/filesystems.php फाइल में disks नामक array होता है। उदाहरण:

 

'disks' => [

    'local' => [

        'driver' => 'local',

        'root' => storage_path('app'),

    ],

    'public' => [

        'driver' => 'local',

        'root' => storage_path('app/public'),

        'url' => env('APP_URL') . '/storage',

        'visibility' => 'public',

    ],

    's3' => [

        'driver' => 's3',

        'key' => env('AWS_ACCESS_KEY_ID'),

        'secret' => env('AWS_SECRET_ACCESS_KEY'),

        'region' => env('AWS_DEFAULT_REGION'),

        'bucket' => env('AWS_BUCKET'),

        'url' => env('AWS_URL'),

    ],

    // अन्य disk जैसे FTP, SFTP आदि भी हो सकते हैं

],

public disk उपयोगी है जब आप चाहते हैं कि फाइल वेब से एक्सेस हो सके

local disk अधिकतर बैकएंड उपयोग या निजी फाइलों के लिए हो सकता है

s3 जैसी ड्राइव क्लाउड स्टोरेज के लिए होती है

आप Storage::disk('disk_name')->put(...) या putFile आदि मेथड से अलग-अलग disk पर काम कर सकते हैं।

4. फ़ाइल एक्सेस — URL, Download, Delete

a) URL पाने के लिए

$url = Storage::url('uploads/' . $filename);

// उदाहरण: /storage/uploads/xyz.jpg

अगर आपने storage:link बना रखा है और public disk ठीक तरह सेट है, तो यह URL ब्राउज़र से एक्सेस हो सकेगा।

b) फ़ाइल डाउनलोड करना

return Storage::download('uploads/' . $filename);

यह फ़ाइल डाऊनलोड करने के लिए response भेजेगा।

c) फ़ाइल हटाना (Delete)

Storage::delete('uploads/' . $filename);

// या

Storage::disk('public')->delete('uploads/' . $filename);

5. सुरक्षा और वैलिडेशन

जब भी आप फाइल अपलोड की सुविधा दें, सुरक्षा पर विशेष ध्यान देना ज़रूरी है:

File type validation — MIME type व एक्सटेंशन जाँचे: उदाहरण:

'myfile' => ‘required|mimes:jpg,jpeg,png,pdf,docx|max:2048’

Filename sanitization — यूज़र द्वारा भेजा नाम 그대로 उपयोग न करें; time() या uniqid() जोड़ें

Visibility — सिर्फ उन्हीं फाइलों को public रखें जो वेब से दिखने योग्य हों

Storage compartmentalization — इमेज अलग फ़ोल्डर, डॉक्यूमेंट्स अलग फ़ोल्डर

रख-रखाव (Cleanup) — पुरानी, अप्रयुक्त फाइलें डिलीट करने का सिस्टम रखें

कई डेवलपर्स Reddit पर शिकायत करते हैं कि फ़ाइल सिर्फ temporary path में रह जाती है क्योंकि symbolic link नहीं बनाते या disk configuration ग़लत होती है।

6. उदाहरण कोड (Summary)

routes/web.php

Route::view('/upload', 'upload_form')->name('file.form');

Route::post('/upload', [FileController::class, 'upload'])->name('file.upload');

resources/views/upload_form.blade.php

<!DOCTYPE html>

<html>

<head><title>File Upload</title></head>

<body>

    @if (session('success'))

        <div>{{ session('success') }}</div>

    @endif

    @if ($errors->any())

        <div>

            <ul>

            @foreach ($errors->all() as $err)

                <li>{{ $err }}</li>

            @endforeach

            </ul>

        </div>

    @endif

    <form action="{{ route('file.upload') }}" method="POST" enctype="multipart/form-data">

        @csrf

        <input type="file" name="myfile">

        <button type="submit">Upload</button>

    </form>

</body>

</html>

App/Http/Controllers/FileController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Storage;

class FileController extends Controller

{

    public function upload(Request $request)

    {

        $request->validate([

            'myfile' => 'required|mimes:jpg,jpeg,png,pdf,docx|max:2048',

        ]);

        if ($request->hasFile('myfile')) {

            $file = $request->file('myfile');

            $filename = time() . '_' . $file->getClientOriginalName();

            $path = $file->storeAs('uploads', $filename, 'public');

            return back()->with('success', "फ़ाइल अपलोड हो गई — $path");

        }

        return back()->withErrors(['myfile' => 'फ़ाइल अपलोड नहीं हो सकी']);

    }

}

7. अतिरिक्त टिप्स & निष्कर्ष

यदि आपकी एप्लिकेशन मीडिया-भारी है (बहुत सी इमेज / वीडियो), तो S3 या अन्य क्लाउड स्टोरेज उपयोग करना बेहतर हो सकता है

आप थंबनेल (thumbnail) या image optimization लाइब्रेरी (जैसे Intervention Image) के साथ फ़ाइल को अपलोड करते समय प्रोसेस कर सकते हैं

बड़े फ़ाइल अपलोड के लिए chunked upload या queue आधारित upload विचार करें

फाइल नामों को random रखें ताकि ओवरराइड की समस्या न ho.