I'm always excited to take on new projects and collaborate with innovative minds.

Phone

+20 115 052 9992

Website

https://ibrahimahmed.online/

Social Links

حل مشكلة رفع الملفات الكبيرة في لارافيل (Laravel) باستخدام تجزئة الملفات (Chunk Uploads)

حل مشكلة رفع الملفات الكبيرة في لارافيل (Laravel) باستخدام تجزئة الملفات (Chunk Uploads) يا مساء الفل على كل المبرمجين. أكيد مريت بالموقف ده: العميل يطلب منك مي

حل مشكلة رفع الملفات الكبيرة في لارافيل (Laravel) باستخدام تجزئة الملفات (Chunk Uploads)
Reading Count: 4

حل مشكلة رفع الملفات الكبيرة في لارافيل (Laravel) باستخدام تجزئة الملفات (Chunk Uploads)

يا مساء الفل على كل المبرمجين. أكيد مريت بالموقف ده: العميل يطلب منك ميزة رفع ملفات (File Uploads) في السيستم بتاعك، وفجأة تلاقي الملفات اللي بتترفع حجمها ضخم، وتظهر لك رسالة الخطأ الشهيرة "413 Request Entity Too Large" أو يخلص وقت الـ PHP (Timeout) والملف ما يترفعش. إنت هنا بتقف محتار، هل أزود الـ upload_max_filesize في ملف php.ini؟ طيب ولو الـ Hosting أو السيرفر ليه حدود؟ هنا بيجي دور الحل الذكي: تجزئة الملفات (Chunk Uploads).

ليه تقنية رفع الملفات على أجزاء هي الحل؟

بدل ما تحاول ترفع ملف حجمه 500 ميجا في "باقة واحدة" والسيرفر يقع منك، الفكرة في الـ Chunk Uploads إننا بنقسم الملف ده لأجزاء صغيرة (مثلاً كل جزء 1 ميجا). المتصفح بيبعت الأجزاء دي واحد ورا التاني، ولو حصل أي مشكلة في جزء معين، بنقدر نعمل إعادة محاولة (Retry) للجزء ده بس، بدل ما نعيد رفع الملف كله من الأول. ده بيوفر على السيرفر ضغط الذاكرة (Memory Usage) وبيخلي تجربة المستخدم (UX) أفضل بكتير.

الخطوة الأولى: تهيئة المتصفح لتقطيع الملف

في الـ Frontend، بنستخدم JavaScript عشان نقطع الملف. الـ API بتاع الـ File في المتصفح بيسمح لنا نستخدم دالة slice عشان ناخد جزء معين من الملف (Blob). بنستخدم مكتبات زي Resumable.js أو Uppy.io، ودول بيسهلوا عليك الموضوع جداً وبيتعاملوا مع الـ Retry والـ Progress bar تلقائياً.

الخطوة الثانية: استقبال الأجزاء في لارافيل (Laravel)

في الـ Backend، لازم نستقبل كل جزء ونخزنه بشكل مؤقت في فولدر خاص، وبعد ما نتأكد إن كل الأجزاء وصلت، بنعمل عملية تجميع (Assembly) للأجزاء دي عشان نكون الملف الأصلي. شوف المثال البسيط ده:


public function uploadChunk(Request $request)
{
    $file = $request->file('file');
    $chunkIndex = $request->input('chunk_index');
    $totalChunks = $request->input('total_chunks');
    $fileName = $request->input('file_name');

    // تخزين الجزء في فولدر مؤقت
    $path = storage_path('app/chunks/' . $fileName);
    $file->move($path, $chunkIndex);

    // التحقق إذا كانت كل الأجزاء وصلت
    if ($this->isLastChunk($path, $totalChunks)) {
        return $this->assembleFile($path, $fileName, $totalChunks);
    }

    return response()->json(['message' => 'Chunk uploaded']);
}

الخطوة الثالثة: تجميع الملف (Merging Chunks)

بعد ما كل الأجزاء توصل، بنستخدم دالة file_put_contents مع وضع FILE_APPEND عشان نلحق كل جزء بالتاني بالترتيب. لازم نكون حريصين جداً على ترتيب الأجزاء عشان الملف ما يطلعش "بايظ".


private function assembleFile($path, $fileName, $totalChunks)
{
    $finalPath = storage_path('app/uploads/' . $fileName);
    $out = fopen($finalPath, "wb");

    for ($i = 0; $i < $totalChunks; $i++) {
        $chunkPath = $path . '/' . $i;
        $in = fopen($chunkPath, "rb");
        stream_copy_to_stream($in, $out);
        fclose($in);
        unlink($chunkPath); // مسح الجزء بعد استخدامه
    }

    fclose($out);
    rmdir($path); // مسح الفولدر المؤقت
    return response()->json(['message' => 'File uploaded successfully']);
}

نصيحة من أخ لمبرمج زميل

يا صديقي، الـ Chunk Uploads مش بس كود بتكتبه، دي عقلية (Mindset) بتفكر فيها عشان تحسن أداء النظام (System Performance). مش دايماً الحل الأسهل هو الحل الأفضل. تعلمك للتعامل مع البيانات الضخمة (Large Data Handling) هيفرق معاك جداً في سوق العمل ويخليك "Senior" فاهم إزاي السيرفر بيشتغل تحت ضغط. ابدأ جرب المكتبات الجاهزة، ولو لقيت نفسك محتاج كاستم (Custom Logic)، ابني الـ Logic بتاعك زي ما شرحنا. بالتوفيق في مشروعك القادم!


Share

Related posts

Jul 21, 2026 • 1 min read
Reading Count: 3
تصميم الـ DTOs في لارافيل: إزاي تخلي كودك نظيف ومحمي من الفوضى؟

تصميم الـ DTOs في لارافيل: إزاي تخلي كودك نظيف ومحمي من الفوضى؟ أكيد مريت بالموقف ده: بتبدأ مشروع لا...

Jul 20, 2026 • 1 min read
Reading Count: 8
الدليل الشامل لاستخدام حقن الاعتماديات (Dependency Injection) في لارافيل (Laravel)

الدليل الشامل لاستخدام حقن الاعتماديات (Dependency Injection) في لارافيل (Laravel) أكيد مريت بالموقف...

Jul 20, 2026 • 1 min read
Reading Count: 11
إزاي تبني نظام سجل النشاط (Activity Log) في لارافيل زي المحترفين

إزاي تبني نظام سجل النشاط (Activity Log) في لارافيل زي المحترفين أكيد مريت بالموقف ده قبل كدة: مديرك...