في هذا الدرس سيتم شرح كيفية رفع الملفات للموقع بالطريقة الشائعة وهي نظام الملفات الاعتيادي و الطريقة الأخرى رفع الملفات إلى قاعدة البيانات. هناك اختلافات بينهم في الطريقة والميزات، وأحد الفروق بينهم يكمن في عمليات النسخ الاحتياطي؛ إذ يمكنك تنزيل ملف قاعدة البيانات كملف وحيد ويحتوي على كافة الملفات المرفوعة وفي الجانب الآخر عليك بتنزيل العديد من الملفات حتى يكتمل النسخ. أيضًا استرجاع قاعدة بيانات تحتوي على ملفات معرض للخطأ بشكل أكبر من قاعدة بيانات تحتوي على روابط الملفات فقط.
الدوال التي سنستخدمها في الدرس:
# دوال قواعد البيانات # mysql_connect(); // لفتح اتصال مع خادم قواعد البيانات mysql_select_db(); // لتحديد قاعدة البيانات mysql_query(); // للاستعلام من قاعدة البيانات mysql_close(); // لإغلاق اتصال مع خادم قواعد البيانات # دوال أساسية للتعامل مع الملفات # fopen(); // فتح ملف fread(); // قراءة ملف fclose(); // إغلاق ملف # دوال أخرى # strrchr(); // دالة لاقتطاع آخر جزء في اليمين من نقطة يتم تحديدها in_array(); // دالة للتأكد من توافر قيمة داخل مصفوفة time(); // دالة الوقت أو الطابع الزمني ليونكس move_uploaded_file(); // دالة رفع/ نقل ملف addslashe(); // دالة إضافة علامة الشرطة # مصفوفات # $_GET[]; // مصفوفة جلب المدخلات عن طريق حقل المتصفح $_FILES[]; // مصفوفة جلب تفاصيل ملف مرفوع /* examples: $_FILES['field']['name']; // جلب اسم الملف المرفوع $_FILES['field']['tmp_name']; // جلب الاسم المؤقت للملف على خادم الموقع $_FILES['field']['type']; // جلب نوع الملف $_FILES['field']['size']; // جلب حجم الملف بالبايت $_FILES['field']['error']; // رقم الخطأ في حالة حدوثه */
مواضيع سابقة قد تفيد في هذا الدرس: المتغيرات والمصفوفات ، تسجيل عضو جديد، وتسجيل الدخول ، مكتبة الدوال والكائنات الذكية
أولًا: نموذج رفع الملفات:
للشرح سنستخدم النموذج التالي:
<p align="center"><b><span lang="ar-om">رفع ملف</span></b></p> <form method="POST" enctype="multipart/form-data" action="upload.php"> <p align="center"><input type="file" name="file" size="20"><span lang="ar-om"> </span><input type="submit" value="رفع" name="B1"></p> </form> </pre>
لاحظ أن اسم حقل الملف هو “file” والنموذج يتوجه للملف upload.php بعد اعتماده.
ثانيًا: عملية رفع الملف:
الطريقة الأولى: استخدام نظام الملفات الاعتيادي
محتوى الملف upload.php مع الشرح:
<?PHP # المتغيرات # $setting = array(); $setting['upload_directory'] = 'upload'; //مسار رفع الملف $setting['blocked_types'] = array('.php', '.html', '.asp', '.aspx'); //الامتدادات المحظورة if(!empty($_FILES['file']['name'])) // التأكد من وجود ملف عبر التحقق من وجود اسمه { $file_extension = strrchr($_FILES['file']['name'], '.'); //اقتطاع امتداد الملف من الاسم if(!in_array($file_extension, $setting['blocked_types'])) //التحقق إن كان امتداد الملف محجوب { #بدأ عملية الرفع هنا# $new_file = time().$file_extension; //اسم الملف الجديد، هنا سيكون الوقت وامتداد الملف $uploading = move_uploaded_file($_FILES['file']['tmp_name'], 'upload/'.$new_file); //دالة رفع الملف، في الشطر الأول نضع الملف المرفوع والشطر الثاني الوجهة الجديدة للملف if($uploading) //التحقق من رفع الملف { echo '<p align="center">تم رفع الملف بنجاح ولله الحمد</p>'."\n"; echo '<p align="center" dir="ltr"><a href="upload/'.$new_file.'">Download file</a></p>'."\n"; } else echo '<p align="center">خطأ غير متوقع أثناء الرفع .. </p>'."\n"; } else echo '<p align="center">لا يمكن رفع هذا الامتداد من الملفات</p>'."\n"; } else echo '<p align="center">يجب اختيار ملف</p>'."\n"; ?>
الطريقة الثانية: رفع الملفات إلى قاعدة البيانات:
بنية قاعدة البيانات:
CREATE TABLE `file` ( `fid` int(11) NOT NULL auto_increment, `name` VARCHAR( 255 ) NOT NULL , `type` VARCHAR( 255 ) NOT NULL , `data` longblob NOT NULL , PRIMARY KEY ( `fid` ) ) ENGINE = MYISAM
بعد زراعة قاعدة البيانات في خادم الموقع ننتقل للملف upload.php من جديد لكن بطريقة مختلفة عن السابقة نوعًا ما:
<?PHP # المتغيرات # $database = array(); $database['server'] = 'localhost'; // خادم قواعد البيانات $database['username'] = 'root'; // اسم المستخدم $database['password'] = ''; // كلمة المرور $database['dbname'] = 'upload'; // اسم قاعدة البيانات $setting = array(); $setting['upload_directory'] = 'upload'; //مسار رفع الملف $setting['blocked_types'] = array('.php', '.html', '.asp', '.aspx'); //الامتدادات المحظورة if(!empty($_FILES['file']['name'])) // التأكد من وجود ملف عبر التحقق من وجود اسمه { $file_extension = strrchr($_FILES['file']['name'], '.'); //اقتطاع امتداد الملف من الاسم if(!in_array($file_extension, $setting['blocked_types'])) //التحقق إن كان امتداد الملف محجوب { #بدأ عملية الرفع هنا# $handle = fopen($_FILES['file']['tmp_name'], r); //فتح الملف $data = fread($handle, $_FILES['file']['size']); //قراءة الملف $filedata = addslashes($data); //إضافة علامات سلاش للتمكين من تخزين الملف في قاعدة البيانات بدون اخطاء fclose($handle); //إغلاق الملف /* يمكن اختصار الخطوات السابقة في سطر واحد، لكن للتسهيل تم تقسيمها على عدة أسطر الخطوة التالية هي إضافة المتغير filedata إلى قاعدة البيانات */ $connection = mysql_connect($database['server'], $database['username'], $database['password']); //الاتصال بخادم قواعد البيانات mysql_select_db($database['dbname'], $connection) or die(mysql_error()); //نحديد قاعدة البيانات $insert_data = mysql_query("insert into file set name='".$_FILES['file']['name']."', type='".$_FILES['file']['type']."', data='".$filedata."'") or die(mysql_error()); //إدراج الملف في قاعدة البيانات if($insert_data) //التحقق من إضافة الملف لقاعدة البيانات { echo '<p align="center">تم رفع الملف بنجاح ولله الحمد</p>'."\n"; echo '<p align="center" dir="ltr"><a href="index.php?op=view&fid='.mysql_insert_id().'">Download file</a></p>'."\n"; } else echo '<p align="center">خطأ غير متوقع أثناء الرفع .. </p>'."\n"; mysql_close($connection); //إغلاق الاتصال بخادم قواعد البيانات } else echo '<p align="center">لا يمكن رفع هذا الامتداد من الملفات</p>'."\n"; ?>
يمكنك تنزيل تطبيق للدرس من هنا مع بعض الاختلافات البسيطة ويمكن فهم المثال بسهولة إن كنت متابع للمواضيع السابقة التي سبق ادراج روابطها في هذا الدرس.
لتجربة المثال تذكر تحرير البيانات في الملف config.php وزارعة ملف قاعدة البيانات
للمزيد حول الدرس أو الاستفسارات اضغط هنا للتوجه لصفحة الدرس في المنتدى