• 0

كيف أعيد تسمية ملف قمت برفعه asp.net ?

السؤال الأول:

ما الصحيح؟ رفع الملفات (pdf,docs,images,voice,video) الى قاعدة البيانات مباشرة أم الحفظ في مجلد على السيرفر؟

 

 

السؤال الثاني: 

قمت برفع ملفات الى قاعدة البيانات .. كيف أستطيع اعادة تسمية الملف بعد رفع لتجنب عمل overwriting في قاعدة البيانات 

اريد اعادة تسمية الملف ( سنة، شهر، يوم،ساعة،دقيقة،ثانية)

 

مثال :

ملف سيتم رفعه اسمه c# books.pdf

بعد عملية الرفع يجب ان يكون : 20170423102315 

بحيث لو شخص آخر قام برفع نفس الملف لا يكون هناك تضارب وعمل اعادة كتابة لنفس الملف 

 

بأمل المساعدة في الكود 

بيئة العمل ASP.NET CSHARP

تمّ تعديل بواسطة عبدالله الناصري
خطأ املائي
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

الاجابة على السؤال الاول هي بالطبع تقوم بعمل مجلد لوضع الملفات المحملة فيه , 
الاجابة على السؤال التاني مع امثلة واي تفاصيل اخرى تحتاجها ,قمت بكتابتها لك 
طريقة رفع الملفات في ال asp.net
والتحقق من الانواع والحجم واي تفاصيل اخرى

الادوات المستخدمه هي اداة
FileUpload1
وادارة زر Button

نقوم بوضع الاداتين في الصفحة وبعد هذا داخل حدث النقر على الزر button
نقوم بكتابة الكود الخاص بعملية رفع الملف الذي تم اختيار من الاداة FileUpload1
في داخل مجلد فرعي في مجلد المشروع الرئيسي

لنفرض ان الاسم البرمجي للادة FileUpload1 هو UpImg

في البداية نتحقق من ان المستخدم قد قام بختيار ملف لرفعه
 

كود:

If UpImg.PostedFile.FileName = Nothing Then ErrorLabel.Text = "لم يتم اختيار ملف لرفعه" Exit Sub End If

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

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

الان نقوم بتعريف متغير نسند له المسار الذي سوف يتم تخزين الملف المختار لرفعه فيه مثلا هكذا
 

كود:

Dim FPath As String ="C:\Inetpub\wwwroot\ElectronicMall1.0\uploaded\" & IO.Path.GetFileName(UpImg.PostedFile.FileName)

في البداية قمنا باسناد المسار كامل للمجلد الذي سوف نقوم برفع الملف داخله وهو
C:\Inetpub\wwwroot\ElectronicMall1.0\uploaded\
حيث ان ElectronicMall1.0 هذا هو مجلد المشروع الرئيسي
و uploaded هذا هو اسم المجلد الفرعي الذي سوف نضع فيه الملف

بعد ذلك اسندنا للمتغير اسم الملف الذي يتم اختياره من اداة رفع الملفات UpImg بالكامل يعني الاسم مع الامتداد فلو قمت باختيار صورة اسمها pic1.gif

فان النص الكامل الذي سيتم اسناده للمتغير FPath سيكون بالشكل التالي
C:\Inetpub\wwwroot\ElectronicMall1.0\uploaded\pic1.gif

وهذا يعبر عن مسار الملف الذي سوف نقوم برفعه بعد انتهاء عملية الرفع ووضع الملف في داخل المجلد

نتوقف قليل عند المكتبة IO وتلاحظ اننا في الكود السابق استخدمناها في جلب اسم وامتداد الملف الذي تم اختيارة في اداة رفع الملفات
وهذه مكتبة كامله تتيح لك التحكم بالملفات والمجلدات

في كودنا السابق نلاحظ اننا طلبنا اسم الملف الكامل مع الامتداد للملف الموجود بهذا المسار
UpImg.PostedFile.FileName
وهذه تعيد لنا المسار الكامل للملف الذي تم اختياره من جهازك
فمثلا لو اخترنا من الجهاز ملف pic1.gif
موجود في الدرايف E مباشرة
فان المسار الذي سوف يعود في داخل UpImg.PostedFile.FileName
هو E:\pic1.gif

وباستخدام مكتبة ال IO سوف نقوم بجلب اسم الملف الكامل مع الامتداد للمسار E:\pic1.gif
وبالتالي سوف يعود لنا ب pic1.gif
وهذا مافعلناه بالكود
 

كود:

Dim FPath As String ="C:\Inetpub\wwwroot\ElectronicMall1.0\uploaded\" & IO.Path.GetFileName(UpImg.PostedFile.FileName)

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

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

1- ان الملف ضمن الامتدادت المسموح برفعها
2- ان الملف ضمن الحجم المسموح رفعه

للتأكد من امتداد الملف نستخدم مكتبة ال IO

الكود التالي سوف يعيد لنا امتداد الملف فقط بدون اسمه مثلا لو كان اسم الملف هو pic1.gif
فان الكود التالي سوف يعيد لنا الامتداد او نوع الملف فقط هكذا .gif
 

كود:

IO.Path.GetExtension(FPath)

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

كود:

If FEx <> ".gif" Or FEx <> ".GIF" Then ErrorLabel.Text = "نوع الملف الذي تم اختياره غير مسموح به" Exit Sub End If


الان نريد التأكد من حجم الملف ان كان ضمن الحجم المسموح برفعه والكود التالي سوف يعود لنا يحجم الملف المختار بالبايت
 

كود:

upimg.PostedFile.InputStream.Length

نقوم الان بالتحقق من حجم الملف بالشكال التالي مثلا
 

كود:

If UpImg.PostedFile.InputStream.Length > 307200 Then ErrorLabel.Text = "حجم الملف اكبر من الحجم المسموح به" Exit Sub End If

وهنا منعنا تحميل اي ملف حجمه اكبر من 300 كيلو بايت


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

الكود التالي سوف يعود لنا بصح او خطأ
 

كود:

IO.File.Exists(FPath)

في حالة كان المشار FPath موجود في الموقع من قبل وهو مسار مجلد الملفات مضاف له اسم الملف مع امتداده فسوف يعود بصح True
وان كان غير موجود فسوف يعود بخطأ False

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

كود:

If IO.File.Exists(FPath) = True Then ErrorLabel.Text = "اسم الملف موجود من قبل ,قم بتغيير اسم الملف" Exit Sub End If


الان العملية الاخيره هي عملية رفع الملف وتخزينه في داخل مجلد رفع الملفات

وهذا يتم بالكود التالي
 

كود:

UpImg.PostedFile.SaveAs(FPath)

بتنفيذ هذا الكود سوف يقوم برفع الملف المختار من الجهاز وتخزينه في داخل المسار الموجود في المتغير FPath


ملاحظة اخيره :-
هذا هو المبدأ العام وانت يمكنك باستخدام مكتبة ال IO التحقق من امور اكثر من اسم الملف او نوعه وحجمه  ساترك لك اكتشافها بنفسك على حسب حاجتك . 

اتمنى انا اكون قد فدتك .

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

بالنسبة لسؤالك حول الأفضلية لتخزين الملفات 

يفضل تخزين الملفات في مجلد و تخزين مسار الملف فقط في قاعدة البيانات لتفادي التحميل الزائد (overload) على قاعدة البيانات .

 

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

           
string filename = DateTime.Now.ToString("MMddyyyyHHmmss"); 

المتغير filename سيحوي تاريخ اليوم مع الوقت بالساعة و الدقيقة و الثانية

يمكنك الإستفادة منه بالإضافة إلى  ما تفضل الأخ mohamd emran بشرحه .

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

مشكورين يا اخوان على اجابتكم وسعة صدركم

 

كيف اقوم بتخزين المسار في قاعدة البيانات بعد ان قمت بحفظ الملف في المجلد؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

الأفضل والأسهل تخزين فقط المسار، وليس الملف كامل في قاعدة البيانات

هنالك عدة طرق لوضع اسم ملف فريد، منها

DateTime.Ticks

ودالة

GUID.NewGUID()

تجد شرح كامل لي في هذا الفيديو

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن