[PHP/MySQL] رفع و تنزيل الملفات بإستخدام قواعد البيانات
مدرج تحت قسم: دروس
8 سبتمبر 2007
السلام عليكم ورحمة الله و بركاته
بحثت عن دروس لكيفية رفع الملفات بقاعدة البيانات فلم أجد درساً مفيداً واحداً!! فقررت كتابته بنفسي لكم.
بدرسنا اليوم سنتعلم كيفية رفع و تنزيل الملفات إلى قاعدة بيانات من نوع MySQL بإستخدام php.
العمل ينقسم على 4 خطوات
1. زرع كود جدول الملفات بقاعدة البيانات
2. ملف upload.html و يحتوى على الفورم الخاص بإختيار الملف
3. ملف upload.php و يحتوى على اكواد رفع الملف لقاعدة البيانات
4. ملف download.php و يحتوى على اكواد تنزيل الملف من قاعدة البيانات
أولاً: زرع الجدول بقاعدة البيانات
view source
print?
1.CREATE TABLE `files` (
2.`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
3.`filename` VARCHAR(250) NOT NULL ,
4.`content` MEDIUMBLOB NOT NULL ,
5.`filesize` INT(20) NOT NULL ,
6.`filetype` VARCHAR(100) NOT NULL ,
7.PRIMARY KEY (id)
8.)
نزرع الكود من الـphpmyadmin.
بهذا الكود أنشأنا جدول باسم files يحتوى على:
id: رقم الملف بقاعدة البيانات (مفتاح اساسى للصفوف)
filename: اسم الملف و إمتداده
content: الملف
filesize: حجم الملف بالبايت
filetype: الـMimetype للملف
ثانياً: ملف upload.html
غرضنا من الملف هو عرض فورم رفع الملفات ساضع لك كود الفورم و لا تنسى وضع اكواد الـhtml الاساسية>
view source
print?
1.
2.من فضلك اختر ملف ليتم رفعه
3.
ولا تنسوا وضع
view source
print?
1.enctype="multipart/form-data"
فى خصائص الفورم لان من دونها لن يتم رفع الملف.
الآن انتهينا من ملف upload.html.
ثالثاً: ملف upload.php المختص برفع الملفات إلى قاعدة البيانات
الإتصال بقاعدة البيانات
view source
print?
1.$connection = mysqli_connect('localhost','root','','files') or die("فشل الإتصال بقاعدة البيانات");
بهذا الكود قمنا بوضع الإتصال بمتغير و هو connection، إذا فشل الإتصال يخرج البرنامج بالرسالة “فشل الإتصال بقاعدة البيانات”
التأكد من تعيين ملف فعلاً ليتم رفعه
view source
print?
1.if ( !isset($_FILES['File']) )
2.{
3.echo"location.href='upload.html'";
4.}
بهذا الكود نفحص أولاً عدم وجود المفتاح File بالمصفوفة $_FILES بإستخدام الدالة isset، إن لم يتم العثور على المفتاح فيقوم بالرجوع لصفحة الرفع upload.html، وإذا تم العثور على الملف نخرج معلوماته.
view source
print?
1.else
2.{
3.$file_name = $_FILES['File']['name'];
4.$file_name = str_replace(" " , "_" , $file_name);
بهذا الكود اخرجنا اسم الملف ثم استخدمنا الدالة str_replace لإستبدال المسافات(” “) بـ(”_”) لأنه إذا تم إيجاد مسافة باسم الملف فيفشل تنزيله عندما تحمله من القاعدة لجهازك.
والآن نستخرج الحجم ونضعه بالمتغير file_size.
view source
print?
1.$file_size = $_FILES['File']['size'];
بهذا الكود استخرجنا حجم الملف.
والآن نستخرج الـMime Type و نضعه بالمتغير file_type.
view source
print?
1.$file_type = $_FILES['File']['type'];
والآن موعد اهم جزء وهو إستخراج محتوى الملف نفسه
تحديد الملف على السيرفر ونضعه بالمتغير file_cnt.
view source
print?
1.$file_cnt = $_FILES['File']['tmp_name'];
ولكننا لا نستطيع رفع ملف بقاعدة البيانات على هذا الاساس! يجب علينا ان نرفع محتويات الملف و ليس الملف.
إذن ماذا نفعل؟؟
نفتح الملف المؤقت على السيرفر للقراءة ثم نخرج منه المحتويات و نخزنها بمتغير ثم نغلق الملف المؤقت. وهذا ما سنفعله بهذا الكود.
view source
print?
1.$file = fopen($file_cnt,'r');
2.$content = fread($file,$file_size);
3.fclose($file);
كما رأينا أولاً المتغير file و هو متغير لفتح الملف بإستخدام الدالة fopen، اما المتغير content فهو المتغير الذي يحتوى على محتويات الملف بإستخدام الدالة fread، ثم اغلقنا الملف بإستخدام الدالة fclose.
الآن ندخل الملف بقاعدة البيانات.
view source
print?
1.$file_insert = mysqli_query($connection,"
2.INSERT INTO `files` (id,filename,content,filesize,filetype)
3.VALUES('NULL', '".addslashes($file_name)."', '".addslashes($content)."', '".$file_size."', '".$file_type."')
4.");
نتأكد من إدخال الملف.
view source
print?
1.if ( $file_insert )
2.{
إذا تم إدخاله ماذا نفعل ؟ نخرج برسالة تقول “تم تحميل الملف بنجاح , للتحميل اضغط هنا”
ولكن قبل ذلك علينا ان نخرج رقم id الملف بقاعدة البيانات لأن ملف التحميل download.php يحتاج الid حتى يستطيع تحميل الملف. نخرج الid بإستخدام الدالة mysqli_insert_id.
view source
print?
1.$file_id = mysqli_insert_id($connection);
الآن نخرج برسالتنا
view source
print?
1.echo 'تم رفع الملف بنجاح ,
2.
3.
للتحميل اضغط هنا4.
5.';
6.}
وإذا لم يتم رفع الملف؟ نخرج له برسالة “فشل رفع الملف”
view source
print?
1.else
2.{
3.echo'فشل رفع الملف ,
4.';
5.}
وبذلك نكون انتهينا من ملف upload.php. وهذا هو كود ملف upload.php كاملاُ.
view source
print?
01.$connection = mysqli_connect('localhost','root','','files') or die("فشل الإتصال بقاعدة البيانات");
02.if ( !isset($_FILES['File']) )
03.{
04.echo"location.href='upload.html'";
05.}
06.else
07.{
08.$file_name = $_FILES['File']['name'];
09.$file_name = str_replace(" " , "_" , $file_name);
10.$file_size = $_FILES['File']['size'];
11.$file_type = $_FILES['File']['type'];
12.$file_cnt = $_FILES['File']['tmp_name'];
13.$file = fopen($file_cnt,'r');
14.$content = fread($file,$file_size);
15.fclose($file);
16.
17.$file_insert = mysqli_query($connection,"
18.INSERT INTO `files` (id,filename,content,filesize,filetype)
19.VALUES('NULL', '".addslashes($file_name)."', '".addslashes($content)."', '".$file_size."', '".$file_type."')
20.");
21.
22.if ( $file_insert )
23.{
24.$file_id = mysqli_insert_id($connection);
25.echo 'تم رفع الملف بنجاح ,
26.
27.
للتحميل اضغط هنا28.
29.';
30.}
31.else
32.{
33.echo'فشل رفع الملف ,
34.';
35.}
36.
37.}
الآن موعدنا مع آخر ملف و هو download.php و هو لتحميل الملفات من قاعدة البيانات.
رابعاً: ملف download.php المختص بتحميل الملفات من قاعدة البيانات
أولاً الإتصال و تخزين الإتصال بالمتغير connection
view source
print?
1.$connection = mysqli_connect('localhost','root','','files') or die("فشل الإتصال بقاعدة البيانات");
ثانياً تعريف المتغير id و الذي يحتوى على الـid للملف المراد تحميله
view source
print?
1.$id = intval($_GET['id']);
كما رأينا .. يأخذ قيمته من قيمة المفتاح id بالمصفوفة $_GET
ثالثاً نتأكد من وجود قيمة بالمتغير id لأنها إن كانت خالية فلن يقوم بشئ
view source
print?
1.if ( empty($id) )
2.{
3.}
كما رأينا نتأكد من خلال الدالة empty وإن كانت القيمة خالية فلن يفعل شئ. و إن تم إيجاد قيمة ؟
view source
print?
1.else
2.{
نتأكد من وجود ملف برقم الـid (القيمة) بقاعدة البيانات.
نستعلم عن الملف ونضع الإستعلام بالمتغير file.
view source
print?
1.$file = mysqli_query($connection,"SELECT * FROM `files` WHERE id='".$id."'");
نتأكد من عدد الصفوف التي وجدها الإستعلام بإستخدام الدالة mysqli_num_rows
view source
print?
1.$check = mysqli_num_rows($file);
ووضعنا النتيجة بالمتغير check إن كانت النتائج = 0، إذن الملف المطلوب غير موجود.
view source
print?
1.if ( $check == 0 )
2.{
3.}
بمثالنا هذا انا لا افعل شئ عند عدم إيجاد الملف، لكن من الممكن ان تكتب رسالة خطأ , كما تريد. وإذا تم إيجاد نتائج ؟ نحمل الملف.
view source
print?
1.else
2.{
نضع جميع مفاتيح و قيم الصف الذي تم العثور عليه بمصفوفة و نخزنه بالمتغير row بإستخدام الدالة mysqli_fetch_array.
view source
print?
1.$row = mysqli_fetch_array($file);
الآن نضع كل مفتاح بالمصفوفة بمتغير باسمه بإستخدام الدالة extract.
view source
print?
1.extract($row);
الآن نعرف الـheaders
1 – المساحة
view source
print?
1.header("Content-length: ".$filesize."");
2 – الMime type
view source
print?
1.header("Content-type: ".$filetype."");
3 – التحميل باسم الملف
view source
print?
1.header("Content-Disposition: attachment; filename=".stripslashes($filename)."");
4 – إستدعاء محتويات الملف لتكون هى المحتويات التي سيتم تحميلها سنستخدم الدالة print أو echo وستحل اى منهم الآن بمحل الدالة readfile و استغنينا عن readfile لأنها بمعظم الاحيان تسبب اخطاء.
view source
print?
1.print $content;
2.}
3.}
وبذلك نكون انتهينا من ملف download.php. الكود كامل.
view source
print?
01.$connection = mysqli_connect('localhost','root','','files') or die("فشل الإتصال بقاعدة البيانات");
02.
03.$id = intval($_GET['id']);
04.if ( empty($id) )
05.{
06.}
07.else
08.{
09.$file = mysqli_query($connection,"SELECT * FROM `files` WHERE id='".$id."'");
10.$check = mysqli_num_rows($file);
11.if ( $check == 0 )
12.{
13.}
14.else
15.{
16.$row = mysqli_fetch_array($file);
17.extract($row);
18.header("Content-length: ".$filesize."");
19.header("Content-type: ".$filetype."");
20.header("Content-Disposition: attachment; filename=".stripslashes($filename)."");
21.print $content;
22.}
23.}
وبذلك نكون انتهينا من جميع الملفات.
ملاحظة على مصفوفة $_FILES
المصفوفة $_FILES
لنفترض اننا رفعنا ملف بإستخدام form فإن المصفوفة $_FILES تخزن اسم الملف(name) و نوع الملف(type) و حجم الملف(size) و الملف المؤقت على السيرفر(tmp_name).
للكاتب Khaled-F
ما هو التالي؟
بما أنك قد وصلت إلى النهاية، ربما تكون قد أحببت المقال وأردت المزيد: