شوّيت: شبكة كرة قدم اجتماعية




العودة   سوالف سوفت > سوالف برمجة المواقع وتطويرها > PHP
التسجيل المدوّنات البحث مشاركات اليوم جعل الأقسام مقروءة

الرد على الموضوع
 
LinkBack أدوات الموضوع
عضو نشيط
#1  
[PHP/MySQL] رفع و تنزيل الملفات بإستخدام قواعد البيانات

السلام عليكم ورحمة الله و بركاته
بحثت عن دروس لكيفية رفع الملفات بقاعدة البيانات فلم اجد درساً مفيداً واحداً!! فقررت كتابته بنفسى لكم ..

بدرسنا اليوم سنتعلم كيفية رفع و تنزيل الملفات إلى قاعدة بيانات من نوع MySQL بإستخدام php ..

العمل ينقسم على 4 خطوات

1. زرع كود جدول الملفات بقاعدة البيانات
2. ملف upload.html و يحتوى على الفورم الخاص بإختيار الملف
3. ملف upload.php و يحتوى على اكواد رفع الملف لقاعدة البيانات
4. ملف download.php و يحتوى على اكواد تنزيل الملف من قاعدة البيانات

أولاً : زرع الجدول بقاعدة البيانات
كود PHP:
 CREATE TABLE `files` (
`
idINT(10UNSIGNED NOT NULL AUTO_INCREMENT ,
`
filenameVARCHAR(250NOT NULL ,
`
contentMEDIUMBLOB NOT NULL ,
`
filesizeINT(20NOT NULL ,
`
filetypeVARCHAR(100NOT 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 وإن كانت القيمة خالية فلن يفعل شئ ..

.. و إن تم إيجاد قيمة ؟
كود PHP:
else

نتأكد من وجود ملف برقم الـ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 == )
    {
    } 
بمثالنا هذا انا لا افعل شئ عند عدم إيجاد الملف , لكن من الممكن ان تكتب رسالة خطأ , كما تريد ..

وإذا تم إيجاد نتائج ؟ .. نحمل الملف
كود PHP:
    else
    { 
نضع جميع مفاتيح و قيم الصف الذى تم العثور عليه بمصفوفة و نخزنه بالمتغير row بإستخدام الدالة mysqli_fetch_array
كود PHP:
        $row mysqli_fetch_array($file); 
الآن نضع كل مفتاح بالمصفوفة بمتغير باسمه بإستخدام الدالة extract
كود PHP:
        extract($row); 
الآن نعرف الـ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 == )
    {
    }
    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] رفع و تنزيل الملفات بإستخدام قواعد البيانات







elMASry is offline   قديم 09-09-2007, 04:33 AM
الرد مع إقتباس
عضو نشيط
#2  

بارك الله فيك

درس نادر وفعلا مكنش فى درس واحد مفيد

جزاك الله كل خير

محمد






__________________


Mohamed Mahmoud

Mobile : +20103452846

Blog : Hawy PHP

Mail : Hawy [.] PHP [@] Gmail.com

حسبي الله ونعم الوكيل

Hawy PHP is offline   قديم 09-09-2007, 12:13 PM
الرد مع إقتباس
Banned
#3  

متهيئلى ان التحميل هيكون بطىء وهيسبب ضغط عالى على قاعدة البيانات






Mr_Ak is offline   قديم 09-09-2007, 04:19 PM
الرد مع إقتباس
عضو فعال
#4  

جزاك الله كل خير يا خالد علي الدرس الجامد ده

إقتباس:
متهيئلى ان التحميل هيكون بطىء وهيسبب ضغط عالى على قاعدة البيانات
فعلا التحميل هايسبب ضغط لكن مش هايكون تقيل قوي
و كمان اظن الغرض من الدرس ده مش انك تعمل مركز تحميل علي قاعدة البيانات
لكن مجرد تعليم الطريقة للمبتدئين






__________________
أحمد أبو النصر
Junior php Developer
+20166196074
أحمد أبو النصر is offline   قديم 09-09-2007, 09:34 PM
الرد مع إقتباس
مشرف قسم PHP
#5  

جميل هذا الدرس الذي يلم بجميع الامزر لتحميل الملفات , لكن هناك ملاحظات
- لم تتاكد من نوع الملف , لكن بما انك تخزن في قاعدة البينات ... لا مشكله .
- التخزين في قاعدة ابينات فكره جيده لفهرسة الملفات لكنها فكره اكثر من غير جيد لتخزين محتوى الملف نفسه , في برامج التحميل لا حاجه لتخزين المحتوى في قاعدة البينات الا اذا كان المحتوى نصي وترغب في البحث فيه ... غير ذلك فكره غير جيده .

انصح بتخزين الملفات في مجلد خارج www والباقي كما هو .






__________________
ضيف الله العتيبي مبرمج حر و مهندس معتمد من زيند (ZCE)
الاتصال: daif@daif.net او جوال: 0556639884
الخدمات: تقديم استشارات برمجيه, تطوير بوابات/خدمات إلكترونيه للقطاع العام او الخاص .
daif is offline   قديم 09-09-2007, 11:24 PM
الرد مع إقتباس
عضو سوبر نشيط
#6  

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






الملفات المرفقة
نوع الملف: zip up_to_db.zip‏ (2.0 كيلوبايت, 267 مشاهدة)
__________________
مدونة .. ؟

آخر تعديل بواسطة dev11 في 10-09-2007 الساعة 02:42 PM.
dev11 is offline   قديم 10-09-2007, 02:40 PM
الرد مع إقتباس
عضو سوبر نشيط
#7  

شكرًا لك أخي
قبل فترة، حاولت عمل تطبيق لرفع الملفات لقاعدة البيانات، لكن واجهتني مشكلة في الملفات ذات الحجم الكبير، ولا أقصد هنا 100 mb أو أكثر ، بل أقصد ما هو أكبر من 2 mb فقط

رسالة الخطأ:
"MySQL server has gone away"






__________________
مدونتي .. دروس (PHP, JavaScript, C, Java)
Abdulaziz Al Rashdi is offline   قديم 10-09-2007, 03:00 PM
الرد مع إقتباس
عضو سوبر نشيط
#8  

إقتباس:
المشاركة الأصلية بواسطة الرجل الخارق
شكرًا لك أخي
قبل فترة، حاولت عمل تطبيق لرفع الملفات لقاعدة البيانات، لكن واجهتني مشكلة في الملفات ذات الحجم الكبير، ولا أقصد هنا 100 mb أو أكثر ، بل أقصد ما هو أكبر من 2 mb فقط

رسالة الخطأ:
"MySQL server has gone away"
يجب عليك تعديل حجم الملفات الاقصى في ملف php.ini
كود:
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M






__________________
مدونة .. ؟

آخر تعديل بواسطة dev11 في 10-09-2007 الساعة 03:55 PM.
dev11 is offline   قديم 10-09-2007, 03:52 PM
الرد مع إقتباس
Banned
#9  

إقتباس:
المشاركة الأصلية بواسطة daif
جميل هذا الدرس الذي يلم بجميع الامزر لتحميل الملفات , لكن هناك ملاحظات
- لم تتاكد من نوع الملف , لكن بما انك تخزن في قاعدة البينات ... لا مشكله .
- التخزين في قاعدة ابينات فكره جيده لفهرسة الملفات لكنها فكره اكثر من غير جيد لتخزين محتوى الملف نفسه , في برامج التحميل لا حاجه لتخزين المحتوى في قاعدة البينات الا اذا كان المحتوى نصي وترغب في البحث فيه ... غير ذلك فكره غير جيده .
.
اتا متفق معك فى نفس وجهة النظر لأن التحميل الى قاعدة البيانات بالنسبة الى الملفات الكبيرة يسبب ضغط عالى جداً لأن جميع الزوار يرفعون ملفات و يحملو ملفات فى نفس الوقت من قاعدة بيانات واحدة يعنى تخيل لو كل زائر هيرفع ملف 10 ميجا ولديك 1000 زائر يحملون ملفات ويرفعون فى نفس الوقت التحميل هيكون بطىء جداً وتخيل انت لو عايز تاخد باكاب للموقع شوف حجم قاعدة البيانات هيكون قد ايه واحنا كلنا عارفين طبعاً مشكلة قواعد البيانات الكبيرة






Mr_Ak is offline   قديم 10-09-2007, 04:56 PM
الرد مع إقتباس
عضو نشيط
#10  

السلام عليكم ورحمة الله وبركاته
اولاً شكراً لكم :
بالنسبة لموضوع اخذ باك اب لقاعدة البيانات
فبإمكانك عمل سكربت php بسيط يقوم بتنزيل الملفات من قاعدة البيانات للموقع نفسه .. ثم يحذفها من قاعدة البيانات
ومن ثم إدخالها مرة اخرى إن اردت ..

بالنسبة لموضوع الضغط القوى على الموقع
بإمكانك وضع حد اقصى للزائر بحيث إذا رفع اكثر من 3 ملفات بدقيقة ويحاول رفع الملف الرابع يخرج البرنامج برسالة خطأ "حاول الرفع بعد 5 دقائق اخرى" .. .. (بإستخدام الوقت و IP المستخدم)

بالنسبة لموضوع لا تستطيع رفع اكثر من 2 ميجا
فقام الاخ asaamas جزاه الله خيراً بوضع السبب و الحل ..
إقتباس:
daif جميل هذا الدرس الذي يلم بجميع الامزر لتحميل الملفات , لكن هناك ملاحظات
- لم تتاكد من نوع الملف , لكن بما انك تخزن في قاعدة البينات ... لا مشكله .
- التخزين في قاعدة ابينات فكره جيده لفهرسة الملفات لكنها فكره اكثر من غير جيد لتخزين محتوى الملف نفسه , في برامج التحميل لا حاجه لتخزين المحتوى في قاعدة البينات الا اذا كان المحتوى نصي وترغب في البحث فيه ... غير ذلك فكره غير جيده .

انصح بتخزين الملفات في مجلد خارج www والباقي كما هو .
اولاً النصيحة قيمة جداً ..
بالنسبة للتأكد
انا لم اتاكد لان هذا ليس مركز رفع هذا مجرد تجربة للإستخدام
انا اخرجت file_type من الـ$_FILES['File'] لإنها تحوى الـMime type و بإمكانك إستخدامه كما شئت ..
إقتباس:
- التخزين في قاعدة ابينات فكره جيده لفهرسة الملفات لكنها فكره اكثر من غير جيد لتخزين محتوى الملف نفسه , في برامج التحميل لا حاجه لتخزين المحتوى في قاعدة البينات الا اذا كان المحتوى نصي وترغب في البحث فيه ... غير ذلك فكره غير جيده .
رأيك و انت حر به برأيى افضل ببعض الاحيان ..


شكراً لكم






elMASry is offline   قديم 10-09-2007, 11:17 PM
الرد مع إقتباس
مشرف قسم PHP
#11  

elMASry: نعم البرنامج اكثر من رائع , لكن ما اقوله ليست وجهة نظر في موضوع ثقافي. من ناحية منطقية وعملية وضع الملفات في قاعدة البينات خطأ , ولا ينصح به اطلاقا.

- قاعدة البينات تعطيك مرونه تخزين البينات وارشفتها وفهرستها وانشاء علاقات بينها , لا يمكن ان تستفيد من محتوى الملف حسب ما ذكرت.






__________________
ضيف الله العتيبي مبرمج حر و مهندس معتمد من زيند (ZCE)
الاتصال: daif@daif.net او جوال: 0556639884
الخدمات: تقديم استشارات برمجيه, تطوير بوابات/خدمات إلكترونيه للقطاع العام او الخاص .
daif is offline   قديم 11-09-2007, 03:36 AM
الرد مع إقتباس
عضو نشيط
#12  

والله موضوع قوي

وراح يسعدنا في الحفظ على المساحه في موقعنا






__________________
511
المنفلوطي is offline   قديم 22-09-2007, 12:15 AM
الرد مع إقتباس
الرد على الموضوع


 

أدوات الموضوع

قوانين المشاركات
لا يمكنك كتابة مواضيع جديدة
لا يمكنك إضافة ردود
لا يمكنك إرسال مرفقات
لا يمكنك تعديل مشاركاتك

كود vB متاح
كود [IMG] متاح
كود HTML غير متاح
Trackbacks are متاح
Pingbacks are متاح
Refbacks are متاح


المواضيع المشابهه
الموضوع كاتب الموضوع القسم الردود آخر مشاركة
سكربت "انسى" الإصدار 1.5 إنترنت بلس الويب والويب 2.0 والـ Semantic Web 41 14-07-2007 06:57 PM
تخزين الملفات وجلب الملفات من قاعدة البيانات ؟؟ IT_student PHP 7 19-03-2006 01:35 PM
مركز رفع الملفات الرائع .. من تطويري ... الدحمي الإصلاح والصيانة 27 21-11-2005 06:56 PM
سكربت: انسى (الإصدار 1) إنترنت بلس الويب والويب 2.0 والـ Semantic Web 48 22-07-2005 08:40 AM
تعرف على (4) الـ FTP محمود المسعودي الويب والويب 2.0 والـ Semantic Web 5 11-03-2003 04:40 PM


جميع الأوقات بتوقيت غرينتش +3. الوقت الآن هو 02:50 PM.