[PHP/MySQL] رفع و تنزيل الملفات بإستخدام قواعد البيانات
الكاتب: Khaled-F | 8 سبتمبر 2007
السلام عليكم ورحمة الله و بركاته
بحثت عن دروس لكيفية رفع الملفات بقاعدة البيانات فلم أجد درساً مفيداً واحداً!! فقررت كتابته بنفسي لكم :D ..
بدرسنا اليوم سنتعلم كيفية رفع و تنزيل الملفات إلى قاعدة بيانات من نوع MySQL بإستخدام php ..
العمل ينقسم على 4 خطوات
- زرع كود جدول الملفات بقاعدة البيانات
- ملف upload.html و يحتوى على الفورم الخاص بإختيار الملف
- ملف upload.php و يحتوى على اكواد رفع الملف لقاعدة البيانات
- ملف download.php و يحتوى على اكواد تنزيل الملف من قاعدة البيانات
أولاًً : زرع الجدول بقاعدة البيانات
نزرع الكود من الـphpmyadmin
بهذا الكود أنشأنا جدول باسم files يحتوى على
id : رقم الملف بقاعدة البيانات (مفتاح اساسى للصفوف)
filename : اسم الملف و إمتداده
content : الملف
filesize : حجم الملف بالبايت
filetype : الـMimetype للملف
ثانياًً : ملف upload.html
غرضنا من الملف هو عرض فورم رفع الملفات ساضع لك كود الفورم و لا تنسى وضع اكواد الـhtml الاساسية
الكود :
ولا تنسوا وضع
enctype="multipart/form-data"
فى خصائص الفورم
لان من دونها لن يتم رفع الملف ..
الآن انتهينا من ملف upload.html :)
ثالثاًً : ملف upload.php المختص برفع الملفات إلى قاعدة البيانات
أولاًًً الإتصال بقاعدة البيانات
بهذا الكود قمنا بوضع الإتصال بمتغير و هو connection , إذا فشل الإتصال يخرج البرنامج بالرسالة "فشل الإتصال بقاعدة البيانات"
ثانياًً : التأكد من تعيين ملف فعلاًً ليتم رفعه
بهذا الكود نفحص أولاًًً عدم وجود المفتاح File بالمصفوفة $_FILES بإستخدام الدالة isset
إن لم يتم العثور على المفتاح فيقوم بالرجوع لصفحة الرفع upload.html
وإذا تم العثور على الملف نخرج معلوماته
بهذا الكود
اخرجنا اسم الملف ثم استخدمنا الدالة str_replace لإستبدال المسافات(" ") بـ("_") لأنه إذا تم إيجاد مسافة باسم الملف فيفشل تنزيله عندما تحمله من القاعدة لجهازك
والآن نستخرج الحجم ونضعه بالمتغير file_size
بهذا الكود استخرجنا حجم الملف
والآن نستخرج الـMime Type و نضعه بالمتغير file_type
والآن موعد اهم جزء
إستخراج محتوى الملف نفسه
أولاًًً تحديد الملف على السيرفر ونضعه بالمتغير file_cnt
ولكننا لا نستطيع رفع ملف بقاعدة البيانات على هذا الاساس! يجب علينا ان نرفع محتويات الملف و ليس الملف
إذن ماذا نفعل؟؟
نفتح الملف المؤقت على السيرفر للقراءة ثم نخرج منه المحتويات و نخزنها بمتغير ثم نغلق الملف المؤقت
وهذا ما سنفعله بهذا الكود
كما رأينا أولاًًً المتغير file و هو متغير لفتح الملف بإستخدام الدالة fopen
اما المتغير content فهو المتغير الذي يحتوى على محتويات الملف بإستخدام الدالة fread
ثم اغلقنا الملف بإستخدام الدالة fclose
الآن ندخل الملف بقاعدة البيانات
INSERT INTO `files` (id,filename,content,filesize,filetype)
VALUES('NULL','".addslashes($file_name)."','".addslashes($content)."','".$file_size."','".$file_type."')
");
نتأكد من إدخال الملف
{
إذا تم إدخاله ماذا نفعل ؟
نخرج برسالة تقول "تم تحميل الملف بنجاح , للتحميل اضغط هنا"
ولكن قبل ذلك علينا ان نخرج رقم id الملف بقاعدة البيانات لأن ملف التحميل download.php يحتاج الid حتى يستطيع تحميل الملف
نخرج الid بإستخدام الدالة mysqli_insert_id
الآن نخرج برسالتنا
, وإذا لم يتم رفع الملف! :(
نخرج له برسالة "فشل رفع الملف"
وبذلك نكون انتهينا من ملف upload.php :) :)
كود ملف upload.php كامل
if ( !isset($_FILES['File']) )
{
echo"location.href='upload.html'";
}
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 'تم رفع الملف بنجاح ,
<a href="download.php?id='.$file_id.'">للتحميل اضغط هنا</a>
';
}
else
{
echo'فشل رفع الملف ,
';
}
}
الآن موعدنا مع آخر ملف و هو download.php و هو لتحميل الملفات من قاعدة البيانات :)
رابعاًً : ملف download.php المختص بتحميل الملفات من قاعدة البيانات
أولاًًً الإتصال و تخزين الإتصال بالمتغير connection
ثانياًً تعريف المتغير id و الذي يحتوى على الـid للملف المراد تحميله
كما رأينا .. يأخذ قيمته من قيمة المفتاح id بالمصفوفة $_GET
ثالثاًً : نتأكد من وجود قيمة بالمتغير id لأنها إن كانت خالية فلن يقوم بشئ
كما رأينا نتأكد من خلال الدالة empty وإن كانت القيمة خالية فلن يفعل شئ ..
.. و إن تم إيجاد قيمة ؟
{
Php-MySQL-Uploading-Downloading-Files-Using-Datab
نتأكد من وجود ملف برقم الـid (القيمة) بقاعدة البيانات
نستعلم عن الملف ونضع الإستعلام بالمتغير file
نتأكد من عدد الصفوف التي وجدها الإستعلام بإستخدام الدالة mysqli_num_rows
ووضعنا النتيجة بالمتغير check
إن كانت النتائج = 0 , إذن الملف المطلوب غير موجود
{
}
بمثالنا هذا انا لا افعل شئ عند عدم إيجاد الملف , لكن من الممكن ان تكتب رسالة خطأ , كما تريد ..
وإذا تم إيجاد نتائج ؟ .. نحمل الملف
{
نضع جميع مفاتيح و قيم الصف الذي تم العثور عليه بمصفوفة و نخزنه بالمتغير row بإستخدام الدالة mysqli_fetch_array
الآن نضع كل مفتاح بالمصفوفة بمتغير باسمه بإستخدام الدالة extract
الآن نعرف الـheaders
1 - المساحة
2 - الMime type
3 - التحميل باسم الملف
4 - إستدعاء محتويات الملف لتكون هى المحتويات التي سيتم تحميلها
سنستخدم الدالة print أو echo وستحل اى منهم الآن بمحل الدالة readfile و استغنينا عن readfile لأنها بمعظم الاحيان تسبب اخطاء
وبذلك نكون انتهينا من ملف download.php
الكود كامل ؟
$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 == 0 )
{
}
else
{
$row = mysqli_fetch_array($file);
extract($row);
header("Content-length: ".$filesize."");
header("Content-type: ".$filetype."");
header("Content-Disposition: attachment; filename=".stripslashes($filename)."");
print $content;
}
}
وبذلك نكون انتهينا من جميع الملفات :)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
ملاحظة على مصفوفة $_FILES
2 - المصفوفة $_FILES
لنفترض اننا رفعنا ملف بإستخدام form فإن المصفوفة $_FILES تفعل الآتي ..
المصفوفة $_FILES تخزن اسم الملف(name) و نوع الملف(type) و حجم الملف(size) و الملف المؤقت على السيرفر(tmp_name)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
:)