النتائج 1 إلى 12 من 12

الموضوع: [PHP/MySQL] رفع و تنزيل الملفات بإستخدام قواعد البيانات

  1. #1
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    103

    [PHP/MySQL] رفع و تنزيل الملفات بإستخدام قواعد البيانات



    السلام عليكم ورحمة الله و بركاته
    بحثت عن دروس لكيفية رفع الملفات بقاعدة البيانات فلم اجد درساً مفيداً واحداً!! فقررت كتابته بنفسى لكم ..

    بدرسنا اليوم سنتعلم كيفية رفع و تنزيل الملفات إلى قاعدة بيانات من نوع MySQL بإستخدام php ..

    العمل ينقسم على 4 خطوات

    1. زرع كود جدول الملفات بقاعدة البيانات
    2. ملف upload.html و يحتوى على الفورم الخاص بإختيار الملف
    3. ملف upload.php و يحتوى على اكواد رفع الملف لقاعدة البيانات
    4. ملف download.php و يحتوى على اكواد تنزيل الملف من قاعدة البيانات

    أولاً : زرع الجدول بقاعدة البيانات
    كود PHP:
     CREATE TABLE `files` (
    `
    idINT(10UNSIGNED NOT NULL AUTO_INCREMENT ,
    `
    filenameVARCHAR(250NOT NULL ,
    `
    contentMEDIUMBLOB NOT NULL ,
    `
    filesizeINT(20NOT NULL ,
    `
    filetypeVARCHAR(100NOT NULL ,
    PRIMARY KEY (id)

    نزرع الكود من الـphpmyadmin
    بهذا الكود انشئنا جدول باسم files يحتوى على

    id : رقم الملف بقاعدة البيانات (مفتاح اساسى للصفوف)
    filename : اسم الملف و إمتداده
    content : الملف
    filesize : حجم الملف بالبايت
    filetype : الـMimetype للملف
    ثانياً : ملف upload.html

    غرضنا من الملف هو عرض فورم رفع الملفات ساضع لك كود الفورم و لا تنسى وضع اكواد الـhtml الاساسية
    الكود :
    كود HTML:
    <div align="center">
    <b>من فضلك اختر ملف ليتم رفعه</b>
    <br /><br />
    <form method="post" enctype="multipart/form-data" action="upload.php">
    <input type="hidden" name="uploading" value="1" />
    <input type="file" name="File" />
    <br /><br />
    <input type="submit" value="رفع" />
    </form>
    </div>
    ولا تنسوا وضع
    enctype="multipart/form-data"

    فى خصائص الفورم
    لان من دونها لن يتم رفع الملف ..
    الآن انتهينا من ملف upload.html
    ثالثاً : ملف upload.php المختص برفع الملفات إلى قاعدة البيانات

    اولاً الإتصال بقاعدة البيانات
    كود PHP:
    $connection mysqli_connect('localhost','root','','files') or die("فشل الإتصال بقاعدة البيانات"); 
    بهذا الكود قمنا بوضع الإتصال بمتغير و هو connection , إذا فشل الإتصال يخرج البرنامج بالرسالة "فشل الإتصال بقاعدة البيانات"


    رابعاً : التأكد من تعيين ملف فعلاً ليتم رفعه
    كود PHP:
    if ( !isset($_FILES['File']) )
    {
        echo
    "<script>location.href='upload.html'</script>";

    بهذا الكود نفحص اولاً عدم وجود المفتاح File بالمصفوفة $_FILES بإستخدام الدالة isset
    إن لم يتم العثور على المفتاح فيقوم بالرجوع لصفحة الرفع upload.html

    وإذا تم العثور على الملف نخرج معلوماته

    كود PHP:
    else
    {
        
    $file_name $_FILES['File']['name'];
        
    $file_name str_replace(" " "_" $file_name); 

    بهذا الكود
    اخرجنا اسم الملف ثم استخدمنا الدالة str_replace لإستبدال المسافات(" ") بـ("_") لانه إذا تم إيجاد مسافة باسم الملف فيفشل تنزيله عندما تحمله من القاعدة لجهازك

    والآن نستخرج الحجم ونضعه بالمتغير file_size
    كود PHP:
        $file_size $_FILES['File']['size']; 
    بهذا الكود استخرجنا حجم الملف

    والآن نستخرج الـMime Type و نضعه بالمتغير file_type
    كود PHP:
        $file_type $_FILES['File']['type']; 
    والآن موعد اهم جزء
    إستخراج محتوى الملف نفسه


    اولاً تحديد الملف على السيرفر ونضعه بالمتغير file_cnt
    كود PHP:
        $file_cnt  $_FILES['File']['tmp_name']; 
    ولكننا لا نستطيع رفع ملف بقاعدة البيانات على هذا الاساس! يجب علينا ان نرفع محتويات الملف و ليس الملف

    إذن ماذا نفعل؟؟
    نفتح الملف المؤقت على السيرفر للقراءة ثم نخرج منه المحتويات و نخزنها بمتغير ثم نغلق الملف المؤقت
    وهذا ما سنفعله بهذا الكود
    كود PHP:
        $file      fopen($file_cnt,'r');
        
    $content   fread($file,$file_size);
        
    fclose($file); 
    كما رأينا اولاً المتغير file و هو متغير لفتح الملف بإستخدام الدالة fopen
    اما المتغير content فهو المتغير الذى يحتوى على محتويات الملف بإستخدام الدالة fread
    ثم اغلقنا الملف بإستخدام الدالة fclose

    الآن ندخل الملف بقاعدة البيانات
    كود PHP:
        $file_insert mysqli_query($connection,"
        INSERT INTO `files` (id,filename,content,filesize,filetype)
        VALUES('NULL','"
    .addslashes($file_name)."','".addslashes($content)."','".$file_size."','".$file_type."')
        "
    ); 
    نتأكد من إدخال الملف
    كود PHP:
        if ( $file_insert )
        { 
    إذا تم إدخاله ماذا نفعل ؟
    نخرج برسالة تقول "تم تحميل الملف بنجاح , للتحميل اضغط هنا"
    ولكن قبل ذلك علينا ان نخرج رقم id الملف بقاعدة البيانات لان ملف التحميل download.php يحتاج الid حتى يستطيع تحميل الملف
    نخرج الid بإستخدام الدالة mysqli_insert_id
    كود PHP:
            $file_id mysqli_insert_id($connection); 
    الآن نخرج برسالتنا
    كود PHP:
            echo 'تم رفع الملف بنجاح ,
            <br />
            <a href="download.php?id='
    .$file_id.'">للتحميل اضغط هنا</a>
            <br />
            <input type="submit" onclick="location.href=\'upload.html\'" value="رفع ملف آخر" />'
    ;
        } 

    , وإذا لم يتم رفع الملف!
    نخرج له برسالة "فشل رفع الملف"
    كود PHP:
        else
        {
            echo
    'فشل رفع الملف ,<br /><input type="submit" onclick="location.href=\'upload.html\'" value="رفع ملف آخر" />';
        } 
    وبذلك نكون انتهينا من ملف upload.php
    كود ملف upload.php كامل
    كود PHP:
    $connection mysqli_connect('localhost','root','','files') or die("فشل الإتصال بقاعدة البيانات");
    if ( !isset(
    $_FILES['File']) )
    {
        echo
    "<script>location.href='upload.html'</script>";
    }
    else
    {
        
    $file_name $_FILES['File']['name'];
        
    $file_name str_replace(" " "_" $file_name);
        
    $file_size $_FILES['File']['size'];
        
    $file_type $_FILES['File']['type'];
        
    $file_cnt  $_FILES['File']['tmp_name'];
        
    $file      fopen($file_cnt,'r');
        
    $content   fread($file,$file_size);
        
    fclose($file);
        
        
    $file_insert mysqli_query($connection,"
        INSERT INTO `files` (id,filename,content,filesize,filetype)
        VALUES('NULL','"
    .addslashes($file_name)."','".addslashes($content)."','".$file_size."','".$file_type."')
        "
    );
        
        if ( 
    $file_insert )
        {
            
    $file_id mysqli_insert_id($connection);
            echo 
    'تم رفع الملف بنجاح ,
            <br />
            <a href="download.php?id='
    .$file_id.'" class="text-decoration: blink;">للتحميل اضغط هنا</a>
            <br />
            <input type="submit" onclick="location.href=\'upload.html\'" value="رفع ملف آخر" />'
    ;
        }
        else
        {
            echo
    'فشل رفع الملف ,<br /><input type="submit" onclick="location.href=\'upload.html\'" value="رفع ملف آخر" />';
        }
        


    الآن موعدنا مع آخر ملف و هو download.php و هو لتحميل الملفات من قاعدة البيانات

    ثالثاً : ملف download.php المختص بتحميل الملفات من قاعدة البيانات

    اولاً الإتصال و تخزين الإتصال بالمتغير connection
    [php
    $connection = mysqli_connect('localhost','root','','files') or die("فشل الإتصال بقاعدة البيانات");
    [/php]
    ثانياً تعريف المتغير id و الذى يحتوى على الـid للملف المراد تحميله
    كود PHP:
    $id intval($_GET['id']); 
    كما رأينا .. يأخذ قيمته من قيمة المفتاح id بالمصفوفة $_GET

    ثالثاً : نتأكد من وجود قيمة بالمتغير id لانها إن كانت خالية فلن يقوم بشئ
    كود PHP:
    if ( empty($id) )
    {

    كما رأينا نتأكد من خلال الدالة empty وإن كانت القيمة خالية فلن يفعل شئ ..

    .. و إن تم إيجاد قيمة ؟
    كود PHP:
    else

    نتأكد من وجود ملف برقم الـid (القيمة) بقاعدة البيانات
    نستعلم عن الملف ونضع الإستعلام بالمتغير file
    كود PHP:
        $file  mysqli_query($connection,"SELECT * FROM `files` WHERE id='".$id."'"); 
    نتأكد من عدد الصفوف التى وجدها الإستعلام بإستخدام الدالة mysqli_num_rows
    كود PHP:
        $check mysqli_num_rows($file); 
    ووضعنا النتيجة بالمتغير check
    إن كانت النتائج = 0 , إذن الملف المطلوب غير موجود
    كود PHP:
        if ( $check == )
        {
        } 
    بمثالنا هذا انا لا افعل شئ عند عدم إيجاد الملف , لكن من الممكن ان تكتب رسالة خطأ , كما تريد ..

    وإذا تم إيجاد نتائج ؟ .. نحمل الملف
    كود PHP:
        else
        { 
    نضع جميع مفاتيح و قيم الصف الذى تم العثور عليه بمصفوفة و نخزنه بالمتغير row بإستخدام الدالة mysqli_fetch_array
    كود PHP:
            $row mysqli_fetch_array($file); 
    الآن نضع كل مفتاح بالمصفوفة بمتغير باسمه بإستخدام الدالة extract
    كود PHP:
            extract($row); 
    الآن نعرف الـheaders
    1 - المساحة
    كود PHP:
            header("Content-length: ".$filesize.""); 
    2 - الMime type
    كود PHP:
            header("(anti-spam-content-type:) ".$filetype.""); 
    3 - التحميل باسم الملف
    كود PHP:
            header("Content-Disposition: attachment; filename=".stripslashes($filename).""); 
    4 - إستدعاء محتويات الملف لتكون هى المحتويات التى سيتم تحميلها
    سنستخدم الدالة print او echo وستحل اى منهم الآن بمحل الدالة readfile و استغنينا عن readfile لانها بمعظم الاحيان تسبب اخطاء
    كود PHP:
            print $content;
        }    

    وبذلك نكون انتهينا من ملف download.php
    الكود كامل ؟
    كود PHP:
    $connection mysqli_connect('localhost','root','','files') or die("فشل الإتصال بقاعدة البيانات");

    $id intval($_GET['id']);
    if ( empty(
    $id) )
    {
    }
    else
    {
        
    $file  mysqli_query($connection,"SELECT * FROM `files` WHERE id='".$id."'");
        
    $check mysqli_num_rows($file);
        if ( 
    $check == )
        {
        }
        else
        {
            
    $row mysqli_fetch_array($file);
            
    extract($row);
            
    header("Content-length: ".$filesize."");
            
    header("(anti-spam-content-type:) ".$filetype."");
            
    header("Content-Disposition: attachment; filename=".stripslashes($filename)."");
            print 
    $content;
        }    

    وبذلك نكون انتهينا من جميع الملفات

    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    ملاحظة على مصفوفة $_FILES
    2 - المصفوفة $_FILES
    لنفترض اننا رفعنا ملف بإستخدام form فإن المصفوفة $_FILES تفعل الآتى ..
    المصفوفة $_FILES تخزن اسم الملف(name) و نوع الملف(type) و حجم الملف(size) و الملف المؤقت على السيرفر(tmp_name)

    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    -----------------------------------------------------------
    المصدر : المشروع - [PHP/MySQL] رفع و تنزيل الملفات بإستخدام قواعد البيانات









  2. #2
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    بارك الله فيك

    درس نادر وفعلا مكنش فى درس واحد مفيد

    جزاك الله كل خير

    محمد





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  3. #3


    متهيئلى ان التحميل هيكون بطىء وهيسبب ضغط عالى على قاعدة البيانات






  4. #4


    جزاك الله كل خير يا خالد علي الدرس الجامد ده

    متهيئلى ان التحميل هيكون بطىء وهيسبب ضغط عالى على قاعدة البيانات
    فعلا التحميل هايسبب ضغط لكن مش هايكون تقيل قوي
    و كمان اظن الغرض من الدرس ده مش انك تعمل مركز تحميل علي قاعدة البيانات
    لكن مجرد تعليم الطريقة للمبتدئين





    __________________
    أحمد أبو النصر
    Junior php Developer
    +20166196074

  5. #5
    عضو شرف
    تاريخ التسجيل
    Apr 2002
    المشاركات
    1,379


    جميل هذا الدرس الذي يلم بجميع الامزر لتحميل الملفات , لكن هناك ملاحظات
    - لم تتاكد من نوع الملف , لكن بما انك تخزن في قاعدة البينات ... لا مشكله .
    - التخزين في قاعدة ابينات فكره جيده لفهرسة الملفات لكنها فكره اكثر من غير جيد لتخزين محتوى الملف نفسه , في برامج التحميل لا حاجه لتخزين المحتوى في قاعدة البينات الا اذا كان المحتوى نصي وترغب في البحث فيه ... غير ذلك فكره غير جيده .

    انصح بتخزين الملفات في مجلد خارج www والباقي كما هو .





    __________________
    ضيف الله العتيبي مبرمج حر و مهندس معتمد من زيند (ZCE)
    الاتصال: daif@daif.net او جوال: 0556639884
    الخدمات: تقديم استشارات برمجيه, تطوير بوابات/خدمات إلكترونيه للقطاع العام او الخاص .

  6. #6
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    أشكرك على الدرس ..
    وفي المرفقات سكربت بسيط لرفع الملفات الى قاعدة البيانات قمت شخصيا ببرمجته منذ فترة ..
    اتمنى تعطيني رايك ..





    الملفات المرفقة الملفات المرفقة
    التعديل الأخير تم بواسطة dev11 ; 10-09-2007 الساعة 03:42 PM
    __________________
    مدونة؟

  7. #7
    عضو سوبر نشيط
    تاريخ التسجيل
    Dec 2004
    المشاركات
    884


    شكرًا لك أخي
    قبل فترة، حاولت عمل تطبيق لرفع الملفات لقاعدة البيانات، لكن واجهتني مشكلة في الملفات ذات الحجم الكبير، ولا أقصد هنا 100 mb أو أكثر ، بل أقصد ما هو أكبر من 2 mb فقط :con2:

    رسالة الخطأ:
    "MySQL server has gone away"





    __________________
    مدونتي .. دروس (PHP, JavaScript, C, Java)
    Twitter
    برمجة وتطوير المواقع والمنتديات

  8. #8
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    اقتباس المشاركة الأصلية كتبت بواسطة الرجل الخارق
    شكرًا لك أخي
    قبل فترة، حاولت عمل تطبيق لرفع الملفات لقاعدة البيانات، لكن واجهتني مشكلة في الملفات ذات الحجم الكبير، ولا أقصد هنا 100 mb أو أكثر ، بل أقصد ما هو أكبر من 2 mb فقط :con2:

    رسالة الخطأ:
    "MySQL server has gone away"
    يجب عليك تعديل حجم الملفات الاقصى في ملف php.ini
    كود:
    ; Maximum allowed size for uploaded files.
    upload_max_filesize = 2M






    التعديل الأخير تم بواسطة dev11 ; 10-09-2007 الساعة 04:55 PM
    __________________
    مدونة؟

  9. #9


    اقتباس المشاركة الأصلية كتبت بواسطة daif
    جميل هذا الدرس الذي يلم بجميع الامزر لتحميل الملفات , لكن هناك ملاحظات
    - لم تتاكد من نوع الملف , لكن بما انك تخزن في قاعدة البينات ... لا مشكله .
    - التخزين في قاعدة ابينات فكره جيده لفهرسة الملفات لكنها فكره اكثر من غير جيد لتخزين محتوى الملف نفسه , في برامج التحميل لا حاجه لتخزين المحتوى في قاعدة البينات الا اذا كان المحتوى نصي وترغب في البحث فيه ... غير ذلك فكره غير جيده .
    .
    اتا متفق معك فى نفس وجهة النظر لأن التحميل الى قاعدة البيانات بالنسبة الى الملفات الكبيرة يسبب ضغط عالى جداً لأن جميع الزوار يرفعون ملفات و يحملو ملفات فى نفس الوقت من قاعدة بيانات واحدة يعنى تخيل لو كل زائر هيرفع ملف 10 ميجا ولديك 1000 زائر يحملون ملفات ويرفعون فى نفس الوقت التحميل هيكون بطىء جداً وتخيل انت لو عايز تاخد باكاب للموقع شوف حجم قاعدة البيانات هيكون قد ايه واحنا كلنا عارفين طبعاً مشكلة قواعد البيانات الكبيرة :con2:






  10. #10
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    103


    السلام عليكم ورحمة الله وبركاته
    اولاً شكراً لكم :
    بالنسبة لموضوع اخذ باك اب لقاعدة البيانات
    فبإمكانك عمل سكربت php بسيط يقوم بتنزيل الملفات من قاعدة البيانات للموقع نفسه .. ثم يحذفها من قاعدة البيانات
    ومن ثم إدخالها مرة اخرى إن اردت ..

    بالنسبة لموضوع الضغط القوى على الموقع
    بإمكانك وضع حد اقصى للزائر بحيث إذا رفع اكثر من 3 ملفات بدقيقة ويحاول رفع الملف الرابع يخرج البرنامج برسالة خطأ "حاول الرفع بعد 5 دقائق اخرى" .. .. (بإستخدام الوقت و IP المستخدم)

    بالنسبة لموضوع لا تستطيع رفع اكثر من 2 ميجا
    فقام الاخ asaamas جزاه الله خيراً بوضع السبب و الحل ..
    daif جميل هذا الدرس الذي يلم بجميع الامزر لتحميل الملفات , لكن هناك ملاحظات
    - لم تتاكد من نوع الملف , لكن بما انك تخزن في قاعدة البينات ... لا مشكله .
    - التخزين في قاعدة ابينات فكره جيده لفهرسة الملفات لكنها فكره اكثر من غير جيد لتخزين محتوى الملف نفسه , في برامج التحميل لا حاجه لتخزين المحتوى في قاعدة البينات الا اذا كان المحتوى نصي وترغب في البحث فيه ... غير ذلك فكره غير جيده .

    انصح بتخزين الملفات في مجلد خارج www والباقي كما هو .
    اولاً النصيحة قيمة جداً ..
    بالنسبة للتأكد
    انا لم اتاكد لان هذا ليس مركز رفع هذا مجرد تجربة للإستخدام
    انا اخرجت file_type من الـ$_FILES['File'] لإنها تحوى الـMime type و بإمكانك إستخدامه كما شئت ..
    - التخزين في قاعدة ابينات فكره جيده لفهرسة الملفات لكنها فكره اكثر من غير جيد لتخزين محتوى الملف نفسه , في برامج التحميل لا حاجه لتخزين المحتوى في قاعدة البينات الا اذا كان المحتوى نصي وترغب في البحث فيه ... غير ذلك فكره غير جيده .
    رأيك و انت حر به برأيى افضل ببعض الاحيان ..


    شكراً لكم







  11. #11
    عضو شرف
    تاريخ التسجيل
    Apr 2002
    المشاركات
    1,379


    elMASry: نعم البرنامج اكثر من رائع , لكن ما اقوله ليست وجهة نظر في موضوع ثقافي. من ناحية منطقية وعملية وضع الملفات في قاعدة البينات خطأ , ولا ينصح به اطلاقا.

    - قاعدة البينات تعطيك مرونه تخزين البينات وارشفتها وفهرستها وانشاء علاقات بينها , لا يمكن ان تستفيد من محتوى الملف حسب ما ذكرت.





    __________________
    ضيف الله العتيبي مبرمج حر و مهندس معتمد من زيند (ZCE)
    الاتصال: daif@daif.net او جوال: 0556639884
    الخدمات: تقديم استشارات برمجيه, تطوير بوابات/خدمات إلكترونيه للقطاع العام او الخاص .

  12. #12
    عضو نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    165


    والله موضوع قوي

    وراح يسعدنا في الحفظ على المساحه في موقعنا





    __________________
    511





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  
اعلانات سوالف
0
أضف موقعك هنا | نسائم نيوز | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري