✍️ المقدمة:
عند تطوير تطبيقات الويب باستخدام 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.
التحكم في الحجم والجودة والتنظيم يمنحك مشروعًا احترافيًا من البداية.