الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشروع : عمل رافع للملفات (uploader)

بدأه محمد خليل أبو صلاح في 22 ديسمبر 2002 · 38 رد · 12,522 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

فما هي ميكانيكية العمل ؟؟ و هل هي صعبة ؟؟ و كيف يمكننا ان نواكبهم و لو بالبسيط ؟؟

الحل هو أن تشاركنا هذا المشروع البسيط و الذكي كما أراه انا و الذي أحس بأنه مميز حيث أننا لن نستخدم قواعد البيانات أبدا ..

الفكرة سهلة و تقريبا سهلة جدا و تحتاج فقط لتفكير و تحليل سليم و منطقي و إلمام ببعض دوال الفي بي سكريبت و معرفة بالتعامل مع ال FSO ..

قبل العمل و كالمعتاد أحب أن أضع روابط تفيد في تعلم أساسيات العمل ..

هذه وصلة للتعامل مع الملفات من موقع w3schools و بصراحة موضوع التعامل مع الملفات موضوع مهم يجب ان نتطرق له و لا نستطيع تفاديه أبدا على حساب تطبيقات قواعد البيانات ..

الوصلة : http://www.w3schools.com/asp/asp_ref_file.asp

كما يوجد فروع لها مهمة ..

كما يمكن أن تتابعوا دروس الفي بي سكريبت هنا : www.as4web.cjb.net

بعد ذلك نأتي للعمل ..

طبعا أول شيء سنحدد ماذا سنفعل .. أنا أرى أن نقوم بعمل أبلودر بحيث يوضع باي مكان في أي مجلد ضمن الموقع بحيث يقوم برفع الملفات لمجدل نسميه uploaded يكون على نفس المستوى في المجلدات ..

طبعا يلزمنا صفحة بها عدد من حقول الادخال الخاصة بالملفات و التي تعرف كالتالي :

و نقوم بإضافة 4 حقول للادخال بنفس الاسم جميعا و هو filePath و سنتعلم لاحقا كيف سنفصل كل ملف عن الاخر ..

و نضيف زر لارسال محتويات النموذج من صفحة uploader.asp التي وضعنا بها الحقول إلى صفحة upload.asp التي ستقوم بعمل رفع للملفات ..

أتمنى بداية أن يكون هناك استيعاب كامل للفكرة و التي في المرة القادمة ساكتب الأكواد و سأرفقها بعد أن أرى مشاركاتكم

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

عربي 100% ..

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

أيضا سنجعل خاصية التأكد من وجود المجلد الذي نود الرفع اليه على السيرفر

لتجنب وقوع الأخطاء .. و كيف ننتج عملية اظهار رسائل الحالة لكل ملف لأن العملية ستتعقد قليلا عند المبتدئين لكن لن أتركهم دون فهم المشروع :)

عندما أطرح الكود سيظهر كل شيء مع العلم ان هناك طريقتين لحفظ الملفات الأولى و هي نسخ الملف سطرا سطرا عن طريق ال binary read و هناك طريقة أخرى و هي أسهل و هي طريقة التعامل مع أوامر معينة تابعة لل File scripting Objects و التي سنراها ..

التكملة في الحلقة القادمة :)

You can fly while you can touch the sky

#2

:eek: لا مشاركات .. ما شاء الله ..

توقعت ما ألقى مكان اكتب فيه :)

على العموم يا جماعة انا و الله من أجلكم أكتب هذه المواضيع و الأفكار

و انا متأكد أن أغلبكم لم يتعامل معها و انه في حال استمر على تقنيات تطوير الويب يجب أن يكون متقن لها لانها حاجة ضرورية ..

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

الكود هو :

هذا الجزء العلوي من الصفحة و أكيد مفهوم كود الترميز للغة العربية و بعض الأوامر الخاصة بالمتصفح و طلب الصفحة من جديد من خلال المتصفح ..و اجرائية

لاختصار امر الكتابة ..

 With Response
  .write ""
  .Expires=0
  .Buffer=1
 End With 
'--------------------------------- 
 Sub write(text)
   Response.write(text)
 End Sub

و هذه بعض الأوامر المهمة التي نحتاجها في التعامل مع رافع الملفات ..

  currentPath=request.ServerVariables(30)
  position=InstrRev(currentPath,"")
  currentPage=mid(currentPath,position+1)
  pathOnServer=left(currentPath,position)
  uploadedDirectory=pathOnServer & "uploaded"

ساقوم بشرحها الان :

currentPath تاخذ المسار الحالي للصفحة الحالية upload.asp ز طبعا تأخذ كل المسار على القرص الصلب للسيرفر ..مثلا :

[l]

c:webHostas4webuploderupload.asp

[/l]

position تأخذ قيمة قمية لموقع اخر اشارة موجودة في اسم المسار أي أن InStrRev يقوم بالعد من اخر الكلمة أو السلسلة .. و بالتالي يكون الناتج

[l]

upload.asp

[/l]

currentPage ستأخذ اسم الصفحة حيث أن الدالة mid تأخذ من عند المؤشر الموضوع بجانبها و هنا وضعنا المؤشر يدل على أول خانة بعد إشارة أي يحتفظ باسم الصفحة فقط كالتالي :upload.asp

أما pathOnServer فتأخذ عكس المقطع السابق و هو المسار الذي يقع بضمنه الملف كالتالي :

[l]

c:webHostas4webuploder

[/l]

و بعد ذلك جاء المتغير uploadedDirectory و هو المجلد الذي يفترض أن ننشأه مسبقا داخل المجلد as4web الذي هو مجلد موقعنا الجذر ..

و قد قمنا بجعله كالتالي :

[l]

c:webHostas4webuploderuploaded

[/l]

بناء على اسم المجلد الذي أضفناه للمسار الموجود على السيرفر المضيف ..

اعتقد أن هذه المرحلة المهمة قد انتهت ..

سأتابع معكم قريبا التجديدات التي تخصنا اكثر لكن حبيت أشرح أساس العمل قد خوض غمار المعركة ضد طرق التعامل مع الملفات ;)

بس و الله أتمنى أشوف أي مشاركة حتى أحس بالتجاوب ..

You can fly while you can touch the sky

#3

هذا الجزء الاخر من الكود الذي سنشرحه قبل أن ندخل في المرحلة الأخيرة ..

  filePath=request("filePath")
  filePath=replace(filePath,",","")
  filePath=split(filePath)
'----------------------------------------------  
  ext=array("gif","zip","bmp","jpg","al","txt")
'-----------------------------------------------
  set FSO=Server.CreateObject("Scripting.FileSystemObject")

شرح هذه المجموعة ..

قلنا مسبقا أنه يجب عمل مجموعة من الحقول من نوع file و التي سترسل بيانات مسار الملفات التي اخترتها لترفعها للسيرفر .. و طلبنا أن يكون اسم الحقول جميعها filePath أي نفس الاسم لحكمة ما ساوضحها بعد قليل و هي مهمة جدا في العديد من التطبيقات و حل مثالي لكثير من العقبات التي تقف في طريق المطورين ..

المهم قمنا باستقبال مسار الملفات المرسلة في متغير اسمه filePath طبعا إن كان هناك أكثر من حقل ستكون القيم المرسلة عبارة عن مصفوفة كالتالي :

[l]

c:file.txt, d:go.bmp, d:forum.zip

[/l]

و بالتالي قمنا باستخدام بعد الدوال لمعالجة كل قيمة كلا على حدة و هي replace ثم split التي فصلت كل جزء عن الاخر لنتعامل معه على انه عنصر في مصفوفة ..

بعد ذلك عرفنا متغير اسمه ext على انه مصفوفة تحمل امتداد الملفات التي سنسمح لها فقط بالرفع للسيرفر تفاديا لأي مسبب طاريء مثل الاختراقات أو الأحجام الكبيرة لبعض الامتدادات و غيرها ..

بعد ذلك أنشانا كائن FSO الخاص بالتعامل مع الملفات من خلال الجزئية Scripting.FileSystemObject و التي تمكننا من الوصول للملفات من خلال نظام التشغيل ..

المزيد قريبا ..

You can fly while you can touch the sky

#4

موضوع شيق

عندي أسئلة كثيرة لكن بعد ما تكمل:)

و شكرا على الموضوع

#5

العفو ..

أنا الليلة ان شاء الله راح أكمل ..

You can fly while you can touch the sky

#6

بسم الله الرحمن الرحيم

بصراحة لم أكن أعلم انك مدرس ماهر أيضا... :)

خالد المصرى

#7

:) عن جد عجبك خالد الأسلوب ؟؟

اذا كان جوابك نعم سأعتمده في شرحي لموقعي حيث

أنك تعلم هناك العديد من الطرق و الأساليب للشرح و انا

بصراحة أميل لهذا الأسلوب خاصة الربط بين المواضيع و أنا

في الحقيقة بعد هذا المشروع محضر مفاجأة للجميع خاصة

المشاركين في هذا المشروع لأنهم تقريبا الوحيدين الذين

سيستفيدوا من هذا الدرس ....

أتمنى انك تكون من المستفيدين خاصة إنك ميال للويب من

خلال برمجتك لل JSP ..

مع أطيب التحيات و انا الليلة بحضر في باقي الدرس لننهيه اليوم ان

شاء الله تعالى . :)

You can fly while you can touch the sky

#8

انا متابع لموضوعك الشيق وانتظر المفاجأة الحلوة منك

ويالله بسسسسسسسسسسرعه

ليس العلم أن تعرف المجهول .. و لكن .. أن تستفيد منه

#9

بسم الله الرحمن الرحيم

أولا الأسلوب ممتاز جدا و يناسب جميع المستويات.

بالنسبة للـ ASP فللعلم أشتريت اليوم كتاب Learn ASP in 21 Days :) يعنى انك كسبت تلميذ جديد فى المدرسة :D

خالد المصرى

#10

موضوع ممتاز أخ محمد

بس يا ريت تشرح لنا كيف يمكن تحديد حد أقصي لحجم الملفات و وأنواع معينة للملفات المسموح برفعها :):)(f)(f)

#11

ماذا تقصد يا اخ محمد بال FSO ???????????:o:o:o

#12

أهلا بك خالد معنا و ان شاء الله تستمر و انا واضع عليك أمال كبيرة بصراحة :)

بخصوص أحمد عدلي :

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

أما ال FSO فهي اختصار ل File System Object وهي تابعة ل Microsoft Scripting Runtime و التي تمكننا هذه الكائنات من الوصول للملفات و الوصلة التي وضعتها بالأعلى بها الكثير و الكثير عن الموضوع ..

أتمنى أن يكون ردي كافيا و إلا سأشرح لما أخليك تمل :)

You can fly while you can touch the sky

#13

هذا باقي الكود ..

For i=0 to ubound(filePath)
  requestedInfo=requestedInfo & filePath(i)
 Next 

 IF requestedInfo="" Then 
  write "لم يتم اختيار أي ملف لرفعه للموقع.
"
  write "اضغط هنا للعودة للخلف"
  response.End
 End IF 



' Loop for each requested file path.
For each File in filePath
 'Get file extinsion.
    pos=InStrRev(File,".")
    fileExt=mid(File,pos+1)

  'Get file Name. 
    namePos=InStrRev(File,"")
    fileName=mid(File,namepos+1)

  'check if file extinsion's valdity 
    For i=0 to ubound(ext)
     IF LCase(fileExt)=ext(i) Then extState=True
    Next

     IF extState=True Then
      IF FSO.FileExists(File) and not FSO.FileExists(uploadedDirectory & fileName)  THEN
        FSO.copyFile  File , uploadedDirectory & fileName ,False
        upMsg=upMsg & "تم رفع الملف  " & FileName & "  بنجاح .
"
      Else   
        msg=msg & "	-" & FileName & " .
" 
      End IF

      Else
        IF fileName"" Then  msg=msg & "	-" & FileName & " .
"  


     End IF
    extState=False  Next
'-----------------------------------------  
       IF upMsg"" then write upMsg
       IF msg"" Then        ErrMsg="خطأ وقع أثناء عملية رفع الملفات التالية :
" & msg
        write ErrMsg 
        write "ملاحظة :  ربما كان السبب التالي :
" &_
               "   - امتداد الملف غير مقبول. 
" &_
               "   -  الملف غير موجود بذلك المسار على جهازك. 
" &_
               "   - الملف مرفوع مسبقا على الخادم. 
"                 
               write "اضغط هنا للعودة للخلف"
        End IF

الموضوع التالي سأشرح لأني مو فاهم شي من الألوان :D

You can fly while you can touch the sky

#14

في أول كود بالأحمر قمنا باستقبال الملفات المرسلة في المتغير requestedInfo التي سنستخدمها فقط لمعرفة هل أرسلت معلومات عن ملفات مرفوعة أم أن المستخدم ضغط رفع الملفات و لم يحدد أي ملف ..

طبعا ان كانت القيمة خالية ل requestedInfo تظهر رسالة انه لم يتم رفع ملفات و تظهر وصلة للعودة للخلف ..

انتهينا من هذه الخطوة التي خلصتنا من عمل اجرائيات من جانب العميل

بعد ذلك عملنا دوارة كبيرة تحوي العديد من الوظائف الجزية يكون كل عنصر منها اسمه FILE ك item لكل دورة ..

طبعا ربما يكون ملف واحد أو عدة ملفات ..

المهم لما ندخل الدورة يلزمنا و كشيء منطقي أن نحصل على امتداد الملف و ذلك عن طريق الدالتين InStrRev و mid و قد شرحتها بالأعلى عندما أحضرنا عنوان الصفحة على السيرفر .. ( اللي يريد شرح للنقطة هاي يكتب و بوضحها ) .. نضع امتداد الملف في المتغير fileExt

بعد ذلك نحصل على اسم الملف و نضعه في المتغير fileName بنفس الطريقة السابقة ..

طبعا المتغير FILE يكون على شكل امتداد الملف على جهاز العميل كاملا و نحن في fileName نجعلها على شكل اسم الملف لوحده مثل file.txt

بعد ذلك نفحص هل امتداد الملف موافق عليه و مسموح له بالرفع .. طبعا الناتج للشرط جواب منطقي إما True أو False .. و نحفظ القيمة المنطقية في extState ..

بعد ذلك عملنا شرط جديد و هو هل الملف امتداده مخول له بالرفع للسيرفر ؟؟

إن كان نعم نفحص عن طريق

[l]

FSO.FileExists(File)

[/l]

و أيضا نتأكد من أن المجلد موجود على السيرفر عن طريق

[l]

FSO.FileExists(uploadedDirectory & fileName)

[/l]

إن كان الشرط تحقق سينفذ التالي :

[l]

FSO.copyFile File , uploadedDirectory & fileName ,False

[/l]

و هي عملية نسخ الملف و القيمة الأولى تحمل اسم الملف على جهاز العميل و الباراميتر الثاني تحمل اسم الملف الذي سنحفظه مع مسار المجلد الذي سننسخه و هو على السيرفر و الباراميتر الثالث False معنها عدم السماح لخاصية ال overWrite في حال وجود الملف مسبقا طبعا إن صارت True معناها أن الملف الجديد سيحل محل الملف السابق على السيرفر و الذي يحمل نفس الاسم .. طبعا هناك طرق للتأكد من وجود الملف مسبقا و اجراءات انت تحددها للتصرف مثل نقل الملف .. نحن لا نريد ان ندخل في التفاصيل لأننا نود وضع مثال للتعليم بعدها سنشرح كل شي ..

و طبعا بعد نسخ الملف للسيرفر هناك متغير upMsg الذي يضاف إليه سطر جديد و هو أن الملف باسمه كذا حسب قيمة المتغير FileName تم رفعه بنجاح ..

و إن اختل الشرط من الأول أي أن الملف غير موجود او أن المجلد على السيرفر غير م وجود فسيتم اضافة سطر للمتغير msg يخبر بأن الملف التالي لم يتم رفعه ..

طبعا بعد أن نخرج من كل دورة يجب أن نعيد وضع امتداد الملف extState إلى False حتى يتم فحصه مرة أخرى .. و لو بقي دون تعديل لانطبقت حالة أول ملف على كل الملفات ..

بعد ذلك نأتي لاخر شيء و هو الرسائل التي ستظهر للمستخدم ..

upMsg ستظهر و هي تحوي قيم لاسماء الملفات التي تم رفعها ..

و msg تحوي معلومات الملفات التي لم ترفع لكن نسقناها و وضعناها في متغير ErrMsg الذي يضيف تنسيق معين للرسالة و تبلغنا بأسماء الملفات التي لم ترفع و كذلك عن احتمالية ذلك و هو من المنطق سبب الخروج عن شرط النسخ و هو ان الامتداد غير مقبول أو ان الملف غير موجود أو ان المجلد غير موجود أيضا على السيرفر ..

أتمنى أن تكونوا قد استفدتم شيئا من هذا المشروع و انتظروا مني المفاجأة بعد التجربة للمشروع الذي سأرفقه بعد أن أقوم بتجربته بعد قليل ..:)

You can fly while you can touch the sky

#15

مشكور اخ محمد تسلم و الله

#16

العفو نحن بالخدمة بأي وقت ان شاء الله ..

و ها أنا أرسلت الملفات مرفقة :)

uploader.zip

You can fly while you can touch the sky

#17

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

خطأ وقع أثناء عملية رفع الملفات التالية :

-Documents .

-and .

-aspSmartUpload.zip .

ملاحظة : ربما كان السبب التالي :

- امتداد الملف غير مقبول.

- الملف غير موجود بذلك المسار على جهازك.

- الملف مرفوع مسبقا على الخادم.

اضغط هنا للعودة للخلف

#18

:) اهلا بك بيننا في هذا القسم .. بصراحة أنا كنت متعمد إني أأخر المفاجأة لكن سبقتيني و أظهرتها و هي انه عند تجربة الأبلودر على الجهاز الخاص كل شيء يمشي تمام و عند تجربته على سيرفر مدفوع الأجر نجد ان اسم الملف قد تجزء و بالتالي اختلت الشروط ...

طبعا السبب هو طريقة أرسال البيانات حيث أنني من خلال متابعتي لبعض الرافعات لاحظت اعتماد نظام ال Binary Data read الذي أ،ا نفسي لم أجربه و أود أن تكون فرصة لنتعاون جميعنا لعمل واحد ..

و أنا طرحت المثال السابق ليستفيد كل من ليس له خبرة في التاعمل مع المات ليفهم الأسس التي سنعمل عليها ..

طبعا في عملية التطوير سنستخدم ال textStream للقراءة و الكتابة من العميل للسيرفر ..

لكن أنا سأؤجل العمل مؤقتا بسبب انشغالي باختبارات الجامعة و البحوث و المشاريع هذه الأيام و سأعود لشرح هذه النقاط المهمة بعد الاختبارات ليكون عملا فريدا من نوعه ان شاء الله ..

شكرا لك على هذه الملاحظة التي إن دلت تدل على الإهتمام و حب التعلم حيث أن الأغلب للأسف يأخذون الكود منظرا لو صح القول :rolleyes:

You can fly while you can touch the sky

#19

شكرا على اهتمامك والله يعطيك العافيه وبالتوفيق إن شاء الله في الإمتحانات

وإن شاء الله نكمل المشروع بعد انتهاء فترة الإمتحانات :)

#20

الله يعطيك العافية :: أخي وإن شاء الله سأضع ماعندي عما قريب .....

ولكن لأن الأمور لم تتوضح معي تمام .؟.........(gift)(f)

#21

يا ريت في فترة انشغالي في الاختبارات كل من لديه معلومة أن يضعها هنا حتى نستفيد جميعا و أنا أولكم ;)

على فكرة مهم جدا موضوع ال multipart/form-data في ال Encoding Type

الخاصة بخصائص النموذج Form properties ..

الرجاء البحث في الموضوع لاني متأكد انه سبب مهم لهذه المشكلة اذ لا بد لحين ما انتهي و ابحث بتأني في الموضوع و في الحقيقة الموضوع شيق جدا و مفيد و مميز عن البقية لاني بصراحة كرهت قواعد البيانات و تطبيقاتها من كثر ما سويت عليها تطبيقات :D

بالتوفيق و دعواكم لي بالتوفيق .. :rolleyes:

You can fly while you can touch the sky

#23

لا تستخدموا .. الاسلوب الفائت يعمل مشكلة مع السيرفر الحقيقي و يعمل على السيرفر المحلي .. كان من باب ادخال الاعضاء لعالم التعامل مع الملفات ..

أنا انصحك بالتعامل مع ال text stream و موجود التفاصيل هنا www.w3schools.com/asp أفضل لك ..

فكرة :

قم بانشاء ملف على السيرفر مثيل لاسم الملف المراد نسخه و قم بقراءة حرف حرف و نسخها في الملف الجديد .. هذه هي الطريقة الصحيحة ..

المشكلة اني بانهي اختباراتي في 25 الشهر :'(:'(:'( و ما عندي وقت أبدا

لكن بعدها راح أكتب مواضيع متعلقة تفيد الجميع و أنا أولهم :)

You can fly while you can touch the sky

#25

شكرا لك جدا جدا أخت إيمان و ان شاء الله نردلك اياها بدل الكود ألف ;):D

بس انتهي راح أفهم الكود و أشرحه للاخوة هنا لتعلم الفائدة :)

You can fly while you can touch the sky

مواضيع مشابهة