المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : درس متميز حفظ ملف الى داتا بيز MySql



Bakenam
03-23-2009, 06:53 PM
السلام عليكم ورحمة الله وبركاته



اعضاء المعهد الغالى ترايدنت
تحيه طيبه اليكم


اقدم اليكم اليوم درس خاص جدا ومتقدم .
الدرس يتحدث عن تخزين وحفظ الملفات بداخل قواعد البيانات MySql
بدلا من حفظها بداخل القرص التخزينى
ملاحظه : وصفى للدرس أنه متقدم لا يعنى أنه بدرجه عاليه من الصعوبه ولكننى أقصد ان فئه معينه فقط من المبرمجين الذين يستخدموا تلك الطريقه وهم المبرمجين الذين يقومون باستغلال أقصر الطرق وأفضلها والضين يحرصون على عدم فقدان البيانات الخاصه بهم .
ولذلك اذا كنت مبرمج مبتدئ أو متوسط يمكنك تطبيق الدرس وفهمه أيضا بكل سلاسه .


فوائدها :
1- الحفاظ على مساحة التخزين الخاصه بك بدون استهلاك مساحة المرفقات او الملفات التى تم رفعها http://traidnt.net/vb/images/smilies/bigsmile.gif (http://www.b7st.com/vb)
2- الحفاظ على الملفات المرفوعه بدون فقدانها أو ضياعها http://traidnt.net/vb/images/smilies/bigsmile.gif (http://www.b7st.com/vb).
3- عندما تريد ان تقوم بأخذ نسخه احتياطيه من الموقع يكتفى بأخذ نسخة احتياطيه من قاعدة البيانات فقط فالملفات المرفوعه موجوده بقاعدة البيانات http://traidnt.net/vb/images/smilies/bigsmile.gif (http://www.b7st.com/vb).
4- كافة المشاريع المحترمه http://traidnt.net/vb/images/smilies/smoke1.gif (http://www.b7st.com/vb) تستخدم تلك الطريقه كطريقه متميزه فى الحفاظ على الملفات كسكربت VBulletin .
سكربت VBulletin يستخدم تلك الطريقه فى عملية رفع الملفات المرفقه والصور الشخصيه والصور الرمزيه .


الفكره الأساسيه :
من المعلوم ان قاعدة البيانات لا تسمح بتخزين الملفات بصوره مباشره بداخلها
ولذلك سنحول الملف الى نوع آخر من البيانات حتى يمكن ادخالها وتخزينها بقاعدة البيانات
ولذلك سنقوم بتحويل الملف الى صيغة البيانات BLOB .


خطوات التطبيق للدرس :
1- سنقوم أولا بتكوين قاعدة البيانات التى سيتم تخرين الملف بها وسيكون اسمها upload
بذلك الاستعلام :




رمز PHP:


CREATE TABLE upload (



id INT NOT NULL AUTO_INCREMENT,


name VARCHAR(30) NOT NULL,


type VARCHAR(30) NOT NULL,


size INT NOT NULL,


content MEDIUMBLOB NOT NULL,


PRIMARY KEY(id)


);




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



رمز PHP:


<form method="post" enctype="multipart/form-data">



<table width="350" border="0" cellpadding="1" cellspacing="1" class="box">
<tr>
<td width="246">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input name="userfile" type="file" id="userfile">
</td>
<td width="80"><input name="upload" type="submit" class="box" id="upload" value=" Upload "></td>
</tr>
</table>
</form>




3- سنقوم بتكوين الصفحه الخاصه بعملية تخزين الملف الى قاعدة البيانات والمسئوله عن قرائة الملف باستخدام الداله fopen والداله fread والتى تقوم أيضا بالاتصال بقاعدة البيانات وتنفيذ الاستعلام الخاص باضافة الملف الى قاعدة البيانات .

وسيكون محتواه هو :



رمز PHP:
[php]<?php




if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
{
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];

$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);

if(!get_magic_quotes_gpc())
{
$fileName = addslashes($fileName);
}



$name = "root";
$pass = "";
$dbname = "upload";
$host = "localhost";
//connect with mysql
$link = mysql_connect($host,$name,$pass);
mysql_select_db($dbname,$link);



$query = "INSERT INTO upload (name, size, type, content ) ".
"VALUES ('$fileName', '$fileSize', '$fileType', '$content')";

mysql_query($query) or die(mysql_error());


echo "<br>File $fileName uploaded<br>";
}
?> الى هنا سنكون قد اتممنا عملية ادخال الملف وتخزينه الى قاعدة



الى هنا سنكون قد اتممنا عملية ادخال الملف وتخزينه الى قاعدة البيانات .

__________________________________________________ ________
سنأتى الآن الى الخطوه المقابله لعملية الرفه وهى عملية التحميل


4- الملف down.php سيكون وظيفته هى الاتصال بقاعدة البيانات وعمل رص لأسماء الملفات فى عمود واحد وعند الضغط على أى ملف يتم استدعاؤه من قاعدة البيانات وتحميله .


وسيكون محتواه هو :



رمز PHP:

<html>




<head>
<title>Download File From MySQL</title>
<meta http-equiv="Content-Type" content="****/html; charset=iso-8859-1">
</head>

<body>
<?php
$name = "root";
$pass = "";
$dbname = "upload";
$host = "localhost";
//connect with mysql
$link = mysql_connect($host,$name,$pass);
mysql_select_db($dbname,$link);


$query = "SELECT id, name FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if(mysql_num_rows($result) == 0)
{
echo "Data**** is empty <br>";
}
else
{
while(list($id, $name) = mysql_fetch_array($result))
{

echo "<a href=down2.php?id=$id>$name</a> <br> ";

}
}
?>
</body>
</html>



5- الخطوه الأخيره وهى الخاصه باستدعاء الملف المطلوب واجراء العمليه العكسيه لعملية تحويل صيغة الملف الى BLOB وجعله فى صوره قابله للتحميل للمستخدم .ومحتواه سيكون كما يلى



رمز PHP:

<?php




if(isset($_GET['id']))
{
// if id is set then get the file with the id from data****

$name = "root";
$pass = "";
$dbname = "upload";
$host = "localhost";
//connect with mysql
$link = mysql_connect($host,$name,$pass);
mysql_select_db($dbname,$link);

$id = $_GET['id'];
$query = "SELECT name, type, size, content " .
"FROM upload WHERE id = '$id'";

$result = mysql_query($query) or die('Error, query failed');
list($name, $type, $size, $content) = mysql_fetch_array($result);

header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $content;


exit;
}

?>



والى هنا ستكون قد أتتمت الدرس بنجاح وكاجمالا قمنا بعمل 4 ملفات هم :


1- up.htm : الخاص بتحديد المستخدم للملف المراد تخزينه بقاعدة البيانات .
2- up.php : الخاص بعملية تحويل الملف الى الصيغة BLOB وتخزينه بقاعدة البيانات .
4- down.php : الخاص بعملية صف الملفات لاختيار الملف المراد تحميله .
5- down2.php : الخاص باتمام عملية التحميل للملف الى جهازك .


مرفق مع الدرس ال4 ملفات الخاصه بالدرس جاهزه للتشغيل مباشرة واختبارها


أرجو أن أكون قد وفقت فى تقديم اليكم الدرس
منتظر أن أرى تفاعلكم وتطبيقاتكم وأسئلتكم واستفساراتكم فى الدرس .