JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

Accueil

كيف أنشأت نظام رفع صور متقدم في Laravel مع ضغط تلقائي وحجم مخصص – بدون مكتبات خارجية

 


✍️ المقدمة:

عند تطوير تطبيقات الويب باستخدام Laravel، ستحتاج عاجلاً أو آجلاً إلى ميزة رفع الصور (Image Upload).
المشكلة؟ معظم الأمثلة الموجودة إما:

  • ترفع الصور كما هي بدون ضغط

  • أو تستخدم مكتبات ثقيلة مثل Intervention

  • أو لا تقدم تحكمًا بحجم الصورة النهائي

في هذا المقال سأشرح لك كيف أنشأت نظامًا لرفع الصور في Laravel يقوم بـ:

  • ✅ ضغط الصورة تلقائيًا

  • ✅ إعادة تحجيم الصورة لحجم معين

  • ✅ حفظها بمجلد منظم حسب التاريخ

  • ✅ بدون استخدام مكتبات خارجية

🎯 المتطلبات:

  • Laravel 10 أو أحدث

  • امتداد GD مفعّل في PHP

  • صلاحيات على مجلد storage

📦 الخطوة 1: إنشاء صفحة رفع الصور

في البداية، سننشئ نموذج بسيط في واجهة Blade لرفع صورة:

<form action="{{ route('image.upload') }}" method="POST" enctype="multipart/form-data">
    @csrf
    <input type="file" name="image" required>
    <button type="submit">رفع الصورة</button>
</form>

🛠️ الخطوة 2: إنشاء Route و Controller

// web.php
Route::post('/upload-image', [ImageController::class, 'upload'])->name('image.upload');

الكود في ImageController.php

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

    $original = $request->file('image');

    // اسم الصورة الجديد
    $filename = time() . '_' . uniqid() . '.jpg';

    // مسار الحفظ
    $folder = 'uploads/' . date('Y/m');
    $path = public_path($folder);

    if (!file_exists($path)) {
        mkdir($path, 0755, true);
    }

    // قراءة الصورة
    $image = imagecreatefromstring(file_get_contents($original));

    // إعادة تحجيم الصورة
    $width = 800;
    $height = imagesy($image) * ($width / imagesx($image));
    $resized = imagescale($image, $width, $height);

    // حفظ الصورة بجودة مضغوطة
    imagejpeg($resized, $path . '/' . $filename, 75); // نسبة الضغط 75%

    return back()->with('success', 'تم رفع الصورة بنجاح!');
}

📂 الناتج:

  • يتم حفظ الصور داخل مجلدات مرتبة حسب السنة والشهر
    مثل: /uploads/2025/07/1689502481_xyz.jpg

  • يتم تصغير الصور التي يزيد عرضها عن 800 بكسل

  • يتم ضغط الصور لتقليل حجمها النهائي

🧠 لماذا لم أستخدم مكتبة مثل Intervention؟

رغم أن مكتبة Intervention Image رائعة، إلا أنها تضيف تبعية خارجية، وقد لا تكون متاحة في كل سيرفر.
الهدف هنا هو إبقاء الكود:

  • ✅ خفيفًا وسريعًا

  • ✅ بدون إضافات

  • ✅ قابل للتطوير لاحقًا بسهولة

🛡️ ملاحظات أمنية:

  • تأكد من التحقق من نوع الملف (كما في validate)

  • لا تحفظ الصورة بنفس الاسم الأصلي أبدًا

  • أنشئ مجلدات التخزين بصلاحيات مناسبة (0755)

⚡ مميزات النظام:

(الميزة) (الوصف)
(ضغط تلقائي) (يتم ضغط الصورة بجودة 75% لتقليل الحجم)
(إعادة تحجيم تلقائي) (لضمان تناسق الصور وعدم تحميل صور ضخمة)
(تنظيم الملفات) (حسب التاريخ مما يسهل إدارة الصور)
(بدون مكتبات) (كود نقي وخفيف وبدون تبعيات خارجية)

💡 أفكار تطوير مستقبلية:

  • دعم رفع عدة صور دفعة واحدة

  • تخزين الصور على Amazon S3 أو Cloudinary

  • إنشاء صور مصغرة (Thumbnails) تلقائيًا

  • دعم حذف الصور تلقائيًا بعد مدة معينة

🧾 الخلاصة:

إنشاء نظام رفع صور ذكي باستخدام Laravel لا يتطلب مكتبات ضخمة، بل يمكن تحقيقه باستخدام أدوات PHP البسيطة مثل GD.
التحكم في الحجم والجودة والتنظيم يمنحك مشروعًا احترافيًا من البداية.

NomE-mailMessage