PDA

View Full Version : یک سوال در مورد آپلود فایلهای همنام ...



peymannaji
سه شنبه 04 اردیبهشت 1386, 12:11 عصر
سلام دوستان .
من میخوام در قسمت ثبت نام سایتم که با VISUAL STUDIO 2003 ساختم یک قسمت آپلود داشته باشم که هز کس عکسش رو آپلود کنه ... خوب یک مشکلی ممکنه پیش بیاد که دو کاربر 2 فایل همنام رو بخوان آپلود کنن ... برای رفع این مشکل چه راه حلی وجود داره خواهشا بطور کامل همراه با مثال توضیح بدید ... با تشکر از شما ...

tc1000
سه شنبه 04 اردیبهشت 1386, 12:48 عصر
میتونی در موقع ذخیره کردن اسم فایل رو عوض کنی و اون رو بزرای تاریخ و ساعت سیستم دیگه هیچ وقت همنام نمی شه

release2008
سه شنبه 04 اردیبهشت 1386, 13:46 عصر
من خودم واسه یک پروژه اول اطلاعات کاربر تو بانک درج می شد، بعدش که UserID را بدست می آوردم ، فایل را به اون اسم (UserID) ذخیره می کردم. البته از مناسبه بودنش زیاد مطمئن نیستم

tc1000
سه شنبه 04 اردیبهشت 1386, 13:53 عصر
میتونی این فایل ها رو توی یک جای بصورت temp اول ذخیره بشه و بعد از مرحله بدست آوردن UserID میتونی فایل rename و اون رو ببری بزاری جایی که میخوای
یه راه دیگه هم اینکه که عکس رو توی دیتا بیس ذخیره کنی که دیگه این مسائل رو نداشته باشی

peymannaji
سه شنبه 04 اردیبهشت 1386, 14:15 عصر
من خودم واسه یک پروژه اول اطلاعات کاربر تو بانک درج می شد، بعدش که UserID را بدست می آوردم ، فایل را به اون اسم (UserID) ذخیره می کردم. البته از مناسبه بودنش زیاد مطمئن نیستم

سلام دوست عزیز از رهنمایی شما عزیزان ممنون هستم ....
اما یک سوالی داشتم و اینکه در هنگام آپلود من با چه کدی rename و آپلود کنم ؟ میشه یک مثال بزنید ؟
با تشکر

MehranZand
سه شنبه 04 اردیبهشت 1386, 14:38 عصر
من در پروژه ای که همین امروز تحویل دادم اینکارو کردم!


ProtectedSub Button1_Click(ByVal sender AsObject, ByVal e As System.EventArgs) Handles Button1.Click
lblMessage3.Text = ""
IfNot FileUpload1.FileName = ""Then
If File.Exists(Server.MapPath("~/siteimage/projectpics/") + FileUpload1.FileName) Then
lblMessage1.Text = FileUpload1.FileName + " exsits. if you do not need the file please Delete or choose another file."
Else
If Path.GetExtension(FileUpload1.FileName).ToLower = ".jpg"Then
FileUpload1.SaveAs(Server.MapPath("~/siteimage/projectpics/") + FileUpload1.FileName)
Session("filename1") = FileUpload1.FileName
lblMessage1.Text = "Upload Successful"
Else
lblMessage1.Text = "You can Only JPG extension to upload"
EndIf
EndIf
Else
' lblMessage1.Text = "Please enter filename to upload"
EndIf
IfNot FileUpload2.FileName = ""Then
If File.Exists(Server.MapPath("~/siteimage/projectpics/") + FileUpload2.FileName) Then
lblMessage2.Text = FileUpload2.FileName + " exsits. if you do not need the file please Delete or choose another file."
Else
If Path.GetExtension(FileUpload2.FileName).ToLower = ".jpg"Then
FileUpload2.SaveAs(Server.MapPath("~/siteimage/projectpics/") + FileUpload2.FileName)
Session("filename2") = FileUpload2.FileName
lblMessage2.Text = "Upload Successful"
Else
lblMessage2.Text = "You can Only JPG extension to upload"
EndIf
EndIf
Else
' lblMessage2.Text = "Please enter filename to upload"
EndIf
IfNot FileUpload3.FileName = ""Then
If File.Exists(Server.MapPath("~/siteimage/projectpics/") + FileUpload3.FileName) Then
lblMessage3.Text = FileUpload3.FileName + " exsits. if you do not need the file please Delete or choose another file."
Else
If Path.GetExtension(FileUpload3.FileName).ToLower = ".jpg"Then
FileUpload3.SaveAs(Server.MapPath("~/siteimage/projectpics/") + FileUpload3.FileName)
Session("filename3") = FileUpload3.FileName
lblMessage3.Text = "Upload Successful"
Else
lblMessage3.Text = "You can Only JPG extension to upload"
EndIf
EndIf
Else
' lblMessage3.Text = "Please enter filename to upload"
EndIf
EndSub

البته اینجا سه تا کنترل فایل آپلود هست.
شما همچنیم میتونیدبا متد GetFiles و اختصاص دادن ان به datasource یک گرید ویو اطلاعات فایل های دایرکتوری مشخص شده را نمایش بدهید

mehdi58
سه شنبه 04 اردیبهشت 1386, 17:26 عصر
اگه یه Search در زمینه GUID و Upload بکنی حتما به جوابهای خوبی می رسی و دیگه نیازی به نگرانی در زمینه نام فایلهای مشابه نخواهی داشت !
توی این فروم هم در این زمینه بحث شده .
موفق باشی

babi_wd
چهارشنبه 05 اردیبهشت 1386, 01:44 صبح
http://www.barnamenevis.org/forum/showthread.php?t=65647

hamid58
چهارشنبه 05 اردیبهشت 1386, 11:28 صبح
خوب معمولا نگه داشتن فایل تصویری در بانک اطلاعاتی باعث کند شدن سیستم موقع خوندن اون از بانک اطلاعاتی میشه .یعنی همیشه اولویت با نگه داشتن فایلهای تصویری دریک دایرکتوری خاص و نگه داشتن نام اونها در بانک اطلاعاتی هست تا ذخیره خود فایلها در بانک اطلاعاتی مگر در موارد خاص (مثلا امنیتی !)
اما برای اینکه با مشکل همنام بودن فایلهای قبلی و فایل آپلود شده برخورد نکنیم یک روش همون چک کردن وجود فایلی با همون اسم هست که به دو روش میشه انجام داد . یکی مثل مثالی که در بالا گفته شد و از متد ()File.Exists استفاده کنیم که بهتره . یکی دیگه هم اینکه چون در بانک اطلاعاتی این نام تصاویر رو ذخیره میکنیم با یک select زدن چک کنیم ببینیم آیا قبلا چنین نامی ثبت شده یا نه که در این روش دردسر کانکت شدن به بانک اطلاعاتی وجود داره ....
در روش بالا در صورت وجود فایل هم نام ، ما باید یک پیغام خطا به کاربر نشون بدیم و دوباره از اون بخواهیم که نام فایلش رو تغییر بده و دوباره اقدام به آپلود کنه که باز هم ممکنه نامی که اون انتخاب میکنه از قبل باشه ! مثلا با زیاد شدن تعداد کاربران سایت ، ممکنه نامهای زیادی باشه و انتخاب نامی که قبلا وجود نداشته سخت باشه ... خوب این تغییر نام دادن ها و آپلود های دوباره حتی اگه زمان زیادی هم از کاربر نگیره باعث کند شدن در روند سیستم ثبت نام و صرف زمان بیشتر توسط کاربر خواهد شد .
همون طور که دوستمون mehdi58 گفتن یک روش دیگه استفاده از GUID هست که هنگام ذخیره فایل یک GUID ایجاد کنیم و از اون به عنوان نام فایل استفاده کنیم که در این صورت دیگه نام تکراری نخواهیم داشت و هیچ وقت کاربر ما هم با پیغام خطا جهت اینکه دوباره فایل رو تغییر نام بده و آپلود کنه ، مواجه نخواهد شد .





string guidResult = System.Guid.NewGuid().ToString();


امانکته دیگری که وجود داره این هست که GUID ایجاد شده چیزی شبیه این خواهد بود :



40061089-38f1-4bd4-be54-addce7a4e73b


خوب چون ما معمولا نام تصویر کاربر رو در بانک اطلاعاتی ذخیره میکنیم ممکنه وجود نام هایی به این شکل موجب حجیم شدن بانک اطلاعاتی بشه و ....
یک روش دیگه هم همون چیزی هست که دوستمون tc1000 فرمودن . یعنی شما میتونی تاریخ و ساعت سیستم رو بگیری و یک رشته ایجاد کنی مثلا به این صورت :





DateTime thistime = DateTime.Now;
string year = thistime.Year.ToString();
string month = thistime.Month.ToString();
string day = thistime.Day.ToString();
string hourse = thistime.Hour.ToString();
string min = thistime.Minute.ToString();
string sec = thistime.Second.ToString();
string filename = FileUpload1.PostedFile.FileName;
string picext = Path.GetExtension(filename);
string name = string name = year + month + day + hourse + min + sec + picext;
string strpath = Request.MapPath(Request.ApplicationPath);
strpath += "\\images\\" + name;
FileUpload1.PostedFile.SaveAs(strpath);



که در این حالت نام به دست اومده از GUID هم کوتاهتره و حجم کمتری از فضای بانک اطلاعاتی اشغال میکنه . و همچنین امکان وجود نام مشابه هم وجود نخواهد داشت . همچنین اگر شما فکر میکنید ممکنه 2 کاربر هم زمان در یک ثانیه عکسهاشون رو آپلود کنند، شما میتونید میلی ثانیه هم به آخرش اضافه کنید ..!

mehdi58
چهارشنبه 05 اردیبهشت 1386, 17:21 عصر
خوب معمولا نگه داشتن فایل تصویری در بانک اطلاعاتی باعث کند شدن سیستم موقع خوندن اون از بانک اطلاعاتی میشه .یعنی همیشه اولویت با نگه داشتن فایلهای تصویری دریک دایرکتوری خاص و نگه داشتن نام اونها در بانک اطلاعاتی هست تا ذخیره خود فایلها در بانک اطلاعاتی مگر در موارد خاص (مثلا امنیتی !)
اما برای اینکه با مشکل همنام بودن فایلهای قبلی و فایل آپلود شده برخورد نکنیم یک روش همون چک کردن وجود فایلی با همون اسم هست که به دو روش میشه انجام داد . یکی مثل مثالی که در بالا گفته شد و از متد ()File.Exists استفاده کنیم که بهتره . یکی دیگه هم اینکه چون در بانک اطلاعاتی این نام تصاویر رو ذخیره میکنیم با یک select زدن چک کنیم ببینیم آیا قبلا چنین نامی ثبت شده یا نه که در این روش دردسر کانکت شدن به بانک اطلاعاتی وجود داره ....
در روش بالا در صورت وجود فایل هم نام ، ما باید یک پیغام خطا به کاربر نشون بدیم و دوباره از اون بخواهیم که نام فایلش رو تغییر بده و دوباره اقدام به آپلود کنه که باز هم ممکنه نامی که اون انتخاب میکنه از قبل باشه ! مثلا با زیاد شدن تعداد کاربران سایت ، ممکنه نامهای زیادی باشه و انتخاب نامی که قبلا وجود نداشته سخت باشه ... خوب این تغییر نام دادن ها و آپلود های دوباره حتی اگه زمان زیادی هم از کاربر نگیره باعث کند شدن در روند سیستم ثبت نام و صرف زمان بیشتر توسط کاربر خواهد شد .
همون طور که دوستمون mehdi58 گفتن یک روش دیگه استفاده از GUID هست که هنگام ذخیره فایل یک GUID ایجاد کنیم و از اون به عنوان نام فایل استفاده کنیم که در این صورت دیگه نام تکراری نخواهیم داشت و هیچ وقت کاربر ما هم با پیغام خطا جهت اینکه دوباره فایل رو تغییر نام بده و آپلود کنه ، مواجه نخواهد شد .





string guidResult = System.Guid.NewGuid().ToString();


امانکته دیگری که وجود داره این هست که GUID ایجاد شده چیزی شبیه این خواهد بود :



40061089-38f1-4bd4-be54-addce7a4e73b


خوب چون ما معمولا نام تصویر کاربر رو در بانک اطلاعاتی ذخیره میکنیم ممکنه وجود نام هایی به این شکل موجب حجیم شدن بانک اطلاعاتی بشه و ....
یک روش دیگه هم همون چیزی هست که دوستمون tc1000 فرمودن . یعنی شما میتونی تاریخ و ساعت سیستم رو بگیری و یک رشته ایجاد کنی مثلا به این صورت :





DateTime thistime = DateTime.Now;
string year = thistime.Year.ToString();
string month = thistime.Month.ToString();
string day = thistime.Day.ToString();
string hourse = thistime.Hour.ToString();
string min = thistime.Minute.ToString();
string sec = thistime.Second.ToString();
string filename = FileUpload1.PostedFile.FileName;
string picext = Path.GetExtension(filename);
string name = string name = year + month + day + hourse + min + sec + picext;
string strpath = Request.MapPath(Request.ApplicationPath);
strpath += "\\images\\" + name;
FileUpload1.PostedFile.SaveAs(strpath);



که در این حالت نام به دست اومده از GUID هم کوتاهتره و حجم کمتری از فضای بانک اطلاعاتی اشغال میکنه . و همچنین امکان وجود نام مشابه هم وجود نخواهد داشت . همچنین اگر شما فکر میکنید ممکنه 2 کاربر هم زمان در یک ثانیه عکسهاشون رو آپلود کنند، شما میتونید میلی ثانیه هم به آخرش اضافه کنید ..!

دوست عزیز به نظر شما مجموع تعداد کاراکترهای تاریخ و ساعت سیستم ( با در نظر گرفتن ساعت و دقیقه و ثانیه و میلی ثانیه ها ) چقدر کمتر از GUID می تونه باشه ؟
GUID یه روش استاندارده .
موفق باشی

rezafars
چهارشنبه 05 اردیبهشت 1386, 18:46 عصر
اگه منظورت رو فهمیده باشم باید برای فایل ها یه کلمه یا شماره رندوم بذاری در این صورت هر بار که فایل آپلود می شه با یه کلمه رندوم آپلود می شه اگه می خوای کد شو برا ت بزارم

hamid58
پنج شنبه 06 اردیبهشت 1386, 00:55 صبح
دوست عزیز به نظر شما مجموع تعداد کاراکترهای تاریخ و ساعت سیستم ( با در نظر گرفتن ساعت و دقیقه و ثانیه و میلی ثانیه ها ) چقدر کمتر از GUID می تونه باشه ؟
GUID یه روش استاندارده .
موفق باشی
در بدترین حالت که روز و ساعت و ... را 2 رقمی در نظر بگیریم معمولا حدود 20 کاراکتر ....
گاهی پیش اومده رو پروژ ه هایی کار کردم که مدیر پروژه خیلی به کم حجم کردن اطلاعات در بانک اطلاعاتی تاکید داشته . فقط خواستم تجربیاتم رو گفته باشم ... همچنین حرف شما هم منطقی هست . ممنون از توجه شما :)

peymannaji
پنج شنبه 06 اردیبهشت 1386, 10:48 صبح
DateTime thistime = DateTime.Now;
string year = thistime.Year.ToString();
string month = thistime.Month.ToString();
string day = thistime.Day.ToString();
string hourse = thistime.Hour.ToString();
string min = thistime.Minute.ToString();
string sec = thistime.Second.ToString();
string filename = FileUpload1.PostedFile.FileName;
string picext = Path.GetExtension(filename);
string name = string name = year + month + day + hourse + min + sec + picext;
string strpath = Request.MapPath(Request.ApplicationPath);
strpath += "\\images\\" + name;
FileUpload1.PostedFile.SaveAs(strpath);


که در این حالت نام به دست اومده از GUID هم کوتاهتره و حجم کمتری از فضای بانک اطلاعاتی اشغال میکنه . و همچنین امکان وجود نام مشابه هم وجود نخواهد داشت . همچنین اگر شما فکر میکنید ممکنه 2 کاربر هم زمان در یک ثانیه عکسهاشون رو آپلود کنند، شما میتونید میلی ثانیه هم به آخرش اضافه کنید ..!

سلام دوستان عزیز از راهنمایی همه ممنون ... من از کد بالا استفاده کردم اما قسمت Path.GetExtension(filename); رو ارور میده چون کلمه path اصلا وجود نداشت ... در ضمن من 2003 استفاده میکنم ... ترجیحا وی بی باشه ... لطفا" راهنمایی کنید ... ممنون