السلام عليكم ورحمة الله و بركاته
بحثت عن دروس لكيفية رفع الملفات بقاعدة البيانات فلم اجد درساً مفيداً واحداً!! فقررت كتابته بنفسى لكم
..
بدرسنا اليوم سنتعلم كيفية رفع و تنزيل الملفات إلى قاعدة بيانات من نوع MySQL بإستخدام php ..
العمل ينقسم على 4 خطوات
1. زرع كود جدول الملفات بقاعدة البيانات
2. ملف upload.html و يحتوى على الفورم الخاص بإختيار الملف
3. ملف upload.php و يحتوى على اكواد رفع الملف لقاعدة البيانات
4. ملف download.php و يحتوى على اكواد تنزيل الملف من قاعدة البيانات
أولاً : زرع الجدول بقاعدة البيانات
كود PHP:
CREATE TABLE `files` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
`filename` VARCHAR(250) NOT NULL ,
`content` MEDIUMBLOB NOT NULL ,
`filesize` INT(20) NOT NULL ,
`filetype` VARCHAR(100) NOT 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 وإن كانت القيمة خالية فلن يفعل شئ ..
.. و إن تم إيجاد قيمة ؟
نتأكد من وجود ملف برقم الـ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 == 0 )
{
}
بمثالنا هذا انا لا افعل شئ عند عدم إيجاد الملف , لكن من الممكن ان تكتب رسالة خطأ , كما تريد ..
وإذا تم إيجاد نتائج ؟ .. نحمل الملف
نضع جميع مفاتيح و قيم الصف الذى تم العثور عليه بمصفوفة و نخزنه بالمتغير row بإستخدام الدالة mysqli_fetch_array
كود PHP:
$row = mysqli_fetch_array($file);
الآن نضع كل مفتاح بالمصفوفة بمتغير باسمه بإستخدام الدالة extract
الآن نعرف الـ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 == 0 )
{
}
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] رفع و تنزيل الملفات بإستخدام قواعد البيانات