PDA

View Full Version : يه راه مناسب براي ذخيره عکس ها در فولدر با نام يکتا



bftarane
سه شنبه 30 آبان 1391, 18:47 عصر
سلام.
به نظرتون بهترين روش براي ذخيره عکس در پوشه با نام يونيک چي مي تونه باشه؟
من با uniqidentifier امتحان کردم.
اصلاً خوشم نيومد.
.............
آيا به جز جمع اسم عکس با يه عدد يا استرينگ رندم
و يا Datetime کنوني راه ديگه اي هست؟

با توجه به اينکه تعداد عکسهايي که ممکنه ذخيره بشه مشخص نيست.

M.D.A_M.D.A
سه شنبه 30 آبان 1391, 20:52 عصر
سلام این رو امتحان کردید؟



System.IO.Path.GetRandomFileName();

ali9698
سه شنبه 30 آبان 1391, 21:18 عصر
به نظر من اگر که username هر کاربر از نظر امنیتی اهمیت خاصی نداره و سایتتون مثل همین سایت برنامه نویس هست که همه میتونین username بقیه رو ببینن بهتره از نام کاربری برای اسم فایل عکس استفاده کنین

bftarane
سه شنبه 30 آبان 1391, 21:25 عصر
خيلي جالب بود.
نمي دونم اينجا بپرسم خوبه يا نه؟ به نظرتون فيلدي که در ديتابيس در نظر بگيرم nvarchar(max باشه خوبه؟
من اسم عکس رو با nvarchar(30 ذخيره کرده بودم بدون unique کردن.
يعني براي مجموع اينا چه ديتاتايپي در نظر بگيرم خوبه؟

string filename = "";
string code = System.IO.Path.GetRandomFileName();

filename = code + filename;

hamed_hossani
سه شنبه 30 آبان 1391, 21:29 عصر
سلام
با id رکورد که عکس رو ذخیره می کنید
1-اضافه کردن رکورد
2-برگردان id رکورد
3- انتساب به نام عکس

bftarane
سه شنبه 30 آبان 1391, 21:33 عصر
ه نظر من اگر که username هر کاربر از نظر امنیتی اهمیت خاصی نداره و سایتتون مثل همین سایت برنامه نویس هست که همه میتونین username بقیه رو ببینن بهتره از نام کاربری برای اسم فایل عکس استفاده کنین
اينم ايده جالبيه.

saeed_sho
چهارشنبه 01 آذر 1391, 18:15 عصر
سلام
با id رکورد که عکس رو ذخیره می کنید
1-اضافه کردن رکورد
2-برگردان id رکورد
3- انتساب به نام عکس
این از همه ی راه ها به نظر من بهتره

bftarane
چهارشنبه 01 آذر 1391, 18:21 عصر
آره راه خوبيه ولي وقتي قراره عکس اول در فولدر ذخيره بشه و بعد موقع تأييد درج بشه به نظرم نميشه از اين راه استفاده کرد. چون هنوز id اي در کار نيست. اين طور نيست؟

saeed_sho
چهارشنبه 01 آذر 1391, 18:50 عصر
با یه اسم موقت ذخیره کنید بعد rename کنید

saeed_sho
پنج شنبه 02 آذر 1391, 16:19 عصر
دوستان یکم که فکر کردم بعد از rename باید اسم عکسو هم آپدیت کنیم و با اسم جدید جایگزین کنیم یه نظرم اسم عکسو با تاریخ امروز ذخیره کنیم بهتره

mostafa_hamzeh
پنج شنبه 02 آذر 1391, 17:25 عصر
هر مفدار id بدست اومد ++ کن واسه اینکه خیالت راحت شه می تونی هم تاریخ رو بهش اضافه کنی هم یه مقدار string رندوم

if (FileUpload1.HasFile)
{
Int64 num = Select.GetLastCodeTB("tb_post_lab", "id") + 1;
FileUpload1.SaveAs(Server.MapPath("~/IMGUpload") + "/" + num.ToString() + "-Profile" + FileUpload1.FileName.ToString());}

bftarane
سه شنبه 21 آذر 1391, 11:08 صبح
من فکر مي کردم متوجه جواب شدم
ولي اومدم ديدم نمي دونم قبل از اينکه فايل آپلود بشه چطور بايد id رو به دست بيارم
اصلاً متوجه نمي شم چي بايد در ديتابيس درج بشه قبل از آپلود که id بخواد به دست بياد.
اصلاً اون select. هم نمي دونم چيه
فکر مي کنم بايد کلاس باشه يا نمي دونم به linq ربطي شايد داره.

تنها چيزي که به ذهنم رسيد اينه که اول عکس آپلود بشه در يه پوشه موقت و همزمان درج هم صورت بگيره تا id به دست بياد
حالا کاري که بايد انجام بشه اينه که اسم عکس رو در Viewstate ذخيره کنم
و بعد از به دست اومدن id اسم عکس رو با id تعويض کنم و در ديتابيس ذخيره کنم
خوب حالا چه طوري اسم عکس داخل پوشه رو عوض کنم و در يک پوشه جديد ذخيره کنم؟

تنها راهي هم که براي حل اين مشکل به نظرم مي رسه اينه که يه دکمه بزارم به عنوان ايجاد نام يونيک براي عکس که با کليک اون id ايجاد بشه
و بعد بيام موقع آپلود id رو با اسم عکس عوض کنم و در پوشه ذخيره کنم که اينم به نظرم جالب نيست که از کاربر بخوام آي ايجاد کنه.
نمي دونم شايد ساده تر از اين حرفا باشه و من متوجه نمي شم.
...............................
به هر حال فعلاً اومدم از اين کدها براي يونيک کردن اسم استفاده کردم



private string GetUniqueUploadFileName(string uploadPath, string fileName)
{

string filepath = uploadPath + "/" + fileName;

string fileext = Path.GetExtension(filepath);

string filenamewithoutext = Path.GetFileNameWithoutExtension(filepath);

do
{

Random rnd = new Random();

int temp = rnd.Next(1000, 1000000);

filenamewithoutext += "_" + temp;

fileName = filenamewithoutext + fileext;

filepath = uploadPath + "/" + fileName;

} while (File.Exists(filepath));

return fileName;

}

حالا با اين کدها هم مشکلم اينه که مثلاً يه همچين اسمي ايجاد ميشه
macro-flower-photography-941-7_756914.jpg
خوب خيلي طولاني هست اگه يه وقت اسم عکس کاربر خيلي خيلي طولاني باشه که در جدول ناقص ذخيره ميشه
و عکس نشون داده نميشه
اينو چه کار کنم؟
اگه ديتاتايپ مثلاً nvarchar(max) بگيرم
به نظرتون خيلي فضا اشغال نميشه؟

Alfred188
سه شنبه 21 آذر 1391, 11:38 صبح
درود، من از این فانکشن برای چک کردن اسم فایل ها قبل از ذخیره کردن استفاده می کنم

string checkName(string v1, string v2)
{
// v1: نام فایل
string r = "";
string p = Server.MapPath(v2);//آدرس پوشه فایل ها
int fc = Directory.GetFiles(p).Length;
string[] list = Directory.GetFiles(p);
int opw = 0;
for (int i = 0; i < fc; i++)
{
if (Path.GetFileName(list[i]).Contains(v1))
opw++;
}
if (opw > 0)
{
r = "(" + opw + ")" + v1;
}
else
r = v1;
return r;//نام جدید
}


این فانکشن در صورتی که فایل وجود داشته باشه یه عدد داخل پرانتز بهش اضافه می کنه
_برای ذخیره هم اگه می خواهید اسمش طولانی نشه طول اسم رو بررسی کنید و اگه طولانی بود به کاربر پیام بدید که اسم رو تغییر بده

M.KH-SH
سه شنبه 21 آذر 1391, 11:48 صبح
سلام و درود به همه دوستان

من پیشنهاد میکنم که نام فایل آپلودی را دریافت پسوند اون رو جدا کرده و با یک تابع بسیار ساده تاریخ و زمان و ثانیه کلیک کردن بر روی دکمه آپلود فایل رو دریافت و فایل ذخیره شده را با این اعداد ذخیره کنید و پسوند را نیز در آخر قرار دهید.

احتمال خطا به 0.01 % میرسه و دیگه هیچ فایلی به صورت تکراری در هاست شما ذخیره نمیشه یا اگر خیلی نگران تکراری نبودن فایل ها هستید میتونید تمامی را در یک جدول ذخیره نمایید دیگر نه نیاز به ویرایش اسم فایل هستش و نه نیاز به فولدر برای آپلود تمام در بانک ذخیره میشه و در برنامه فقط از جداول فایل ها برای دانلود لود میشوند.

لطفا منو راهنمایی کنین مرسی:
http://barnamenevis.org/showthread.php?373119-%D8%AF%D8%B1%D8%B3%D8%AA-%DA%A9%D8%B1%D8%AF%D9%86-%D9%85%D9%86%D9%88-%D8%A8%D8%A7-%D8%B2%DB%8C%D8%B1-%DA%AF%D8%B1%D9%88%D9%87-%D9%87%D8%A7-%D9%88-%D8%B2%DB%8C%D8%B1-%D8%B4%D8%A7%D8%AE%D9%87-%D9%87%D8%A7-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%A8%DB%8C-%D9%86%D9%87%D8%A7%DB%8C%D8%AA

ya30ien2
سه شنبه 21 آذر 1391, 12:33 عصر
شما میتونید یک فولد برای آپلود و یکی برای ذخیره داشته باشی
و اول فایل آپلود بشه بعد نامش رو درون یک سشن ذخیره کنید بعد مطلب رو درون بانک ذخیره و بعد id رو بگیرید و نام عکس رو تغییر بدید و به فولد جدید ارسال کنید
البته شاید راه بهتری هم باشه ولی این به فکر من رسید

bftarane
سه شنبه 21 آذر 1391, 16:18 عصر
ممنون جوابها رو خوندم. مي رم اگه مشکلي داشتم ميام مي پرسم.

saeed_sho
سه شنبه 21 آذر 1391, 18:30 عصر
چرا اینقدر قضیه رو میپیچونید این تابع رو ببینید تاریخ جاری رو برای اسم فایل برمیگردونه اگه با اون اسم فایلی پیدا کنه دوباره خودشو صدا میزنه
Private Function SetFileName() As String
Dim dateStr As String = DateTime.Now.ToString("d") + DateTime.Now.TimeOfDay.ToString()
dateStr = dateStr.Replace("/", "").Replace(":", "").Replace(".", "")
If (System.IO.File.Exists(Request.PhysicalApplication Path + "App_Data\" + dateStr + System.IO.Path.GetExtension(fu_import.FileName))) Then
dateStr = SetFileName()
End If
Return dateStr
End Function
کافیه فقط صداش بزنین
Dim fileName As String = SetFileName()

saeed_sho
سه شنبه 21 آذر 1391, 18:32 عصر
حالا من فایل رو در فولدر App_Data ذخیره کردم شما آدرسو عوض کنید

Mohamad1362
سه شنبه 21 آذر 1391, 23:28 عصر
از این تیکه کد استفاده کن ، احتمال برخورد 1 به 1000000000000000000000000000
if (picFileUpload.HasFile)
{
String sp = Server.MapPath("~/Pictures");
String filename = Guid.NewGuid().ToString() + picFileUpload.FileName.Substring(picFileUpload.Fil eName.LastIndexOf("."));
if (sp.EndsWith("\\") == false)
sp += "\\";
sp += filename ;
picFileUpload.PostedFile.SaveAs(sp);
pictureParam.Value = filename ;
}

fakhravari
چهارشنبه 22 آذر 1391, 09:33 صبح
هرچی دوست دارید استفاده کنید.
با exist قبلش چک کنید که فایلی به این اسم نباشد.

mahmood_4246
جمعه 24 آذر 1391, 22:06 عصر
تاریخ و زمان رو به اول نام فایل تصویر اضافه کنید .. هیچ وقت تکراری نمیشه