PDA

View Full Version : سوال: چگونی ذخیره آدرس عکسها؟



salehvasaleh
سه شنبه 05 مرداد 1389, 11:44 صبح
دوستان من دارم یه پروژه ای رو طراحی می کنم که پیش از این هم در موردش سوالی کرده بودم حالا یه سوال تکمیلی دارم و اون اینه که توی فرمی که از لینک زیر قابل دانلود هست من می خوام برنامه طوری باشه که بشه بعد از ثبت تاریخ نامه ، شماره نامه و . . . سایر فیلدهای مشخص شده ، کاربر بتونه بین یک تا 50 تا عکس رو browse کنه و با هر بار browse کردن آدرسی که عکس از اون مسیر انتخاب شده ، در جایی مثل text box یا list box یا آرایه ذخیره بشه و نهایتا تمام این آدرس ها هم در ستون aks دیتابیس ذخیره بشه. ضمن انجام این کار چطوری می شه دکمه ای طراحی کرد که در قسمت picture box هر عکسی رو که مایل باشیم مشاهده بکنیم. فرضا عکس اول یا دوم یا ... .ممنون می شم کمکم کنید.
http://www.persiangig.com/pages/download/?dl=http://salehsabz.persiangig.com/pa.rar

صباح فتحی
سه شنبه 05 مرداد 1389, 11:56 صبح
باید از لیست ایمیج استفاده کنی
این لینکو برو آموزشو دانلود کن
http://www.barnamenevis.org/forum/showthread.php?t=233179&highlight=%D8%A2%D9%85%D9%88%D8%B2%D8%B4+%D8%AA%D8 %B5%D9%88%DB%8C%D8%B1%DB%8C

mmd2009
سه شنبه 05 مرداد 1389, 12:40 عصر
با سلام.

به نتیجه ای رسیدید که چطور می خواهید اطلاعات ( منظور ادرس عکس ها ) رو درون بانک ذخیره کنید ؟

salehvasaleh
سه شنبه 05 مرداد 1389, 13:05 عصر
با سلام.

به نتیجه ای رسیدید که چطور می خواهید اطلاعات ( منظور ادرس عکس ها ) رو درون بانک ذخیره کنید ؟

نه شکم همونجاست نمی دونم بصورت آرایه باشه یا list box یا . . . روشش هم نمی دونم

mmd2009
سه شنبه 05 مرداد 1389, 13:38 عصر
به نظر من یک جدول برای ذخیره عکس هات درست کن و یک ارتباط بین جداول درست کن

ucnazard
سه شنبه 05 مرداد 1389, 15:52 عصر
یه جدول جدا فک کنم باید داشته باشی که با جدول اولیت در ارتباطه با استفاده از ستون کلید جدول اولیت

Editali
سه شنبه 05 مرداد 1389, 16:51 عصر
سلام دوست عزیز

بهترین راه برای کار با عکس تو دیتابیس ذخیره عکس خارج از دیتا بیسه
یعنی برای هر عکس یه کد بساز که به شکل زیره:

تاریخ-زمان-کانتر.پسوند فایل

138951-1230-1.jpg
138951-1230-2.jpg
138951-1230-3.jpg
138951-1230-4.jpg
138951-1230-5.jpg
138951-1230-6.jpg

و فقط آدرس عکسو تو db نگه نمیداری

اگر سیستم چند کاربره باشه هم میتونی کد کاربری رو هم اضافه کنی

saeedr22
سه شنبه 05 مرداد 1389, 17:20 عصر
سلام

شما باید عکس ها رو تو دیتا بیس ذخیره کنین.
بعد اونو با یه حلقه بخونین و بعد اینکه خوندینش تو یه image list ذخیره کنین.
بعد اون image list به یه listview وصل شده باشه.
و با دستور listview.add("عنوان", شماره limagelistindex) عکس هارو توش نشون بدین

salehvasaleh
سه شنبه 05 مرداد 1389, 17:54 عصر
سلام دوست عزیز

بهترین راه برای کار با عکس تو دیتابیس ذخیره عکس خارج از دیتا بیسه
یعنی برای هر عکس یه کد بساز که به شکل زیره:

تاریخ-زمان-کانتر.پسوند فایل

138951-1230-1.jpg
138951-1230-2.jpg
138951-1230-3.jpg
138951-1230-4.jpg
138951-1230-5.jpg
138951-1230-6.jpg

و فقط آدرس عکسو تو db نگه نمیداری

اگر سیستم چند کاربره باشه هم میتونی کد کاربری رو هم اضافه کنی
من می خوام آدرس عکس رو توی دیتابی نگه دارم ولی مشکلم اینه این آدرس رو چطوری ذخیره و در مراحل بعدی بازخوانی کنم؟ من الان یه دیتابی درست کردم که بعد از بروز کردن آدررس ها توی اون ریخته می شه منتها نمی دونم چطوری آدرس ها رو ذخیره کنم. کسی راهی داره
؟

ACorvinus
سه شنبه 05 مرداد 1389, 18:18 عصر
سلام.

ذخیره عکس در خارج از Database در یه برنامه کاربردی اشتباه محض هستش. اگه میخواین عکی رو در database ذخیره کنین اونو باید به باینری تبدیل کرده و در بانک ذخیره کنین و وقتی میخواین نشون بدین اونو از باینری به عکس تبدیل کرده و نشونش بدین.

اگه میخواین کاری بکنین اونو به نحو احس انجام بدین نه اینکه بیاین آدرس رو در بانک عکس رو در یه گوشه ای از هارد ذخیره کنین و یه آدم آماتور بیاد اونارو حذف کنه و بی کلاه بمونین!!!

برای ذخیره عکی به صورت باینری و خوندن اون هزار تا مطلب در همین سایت هستش. یه کوچولو بگرد پیدا می کنی.

موفق باشی.

salehvasaleh
سه شنبه 05 مرداد 1389, 18:28 عصر
سلام.

ذخیره عکس در خارج از Database در یه برنامه کاربردی اشتباه محض هستش. اگه میخواین عکی رو در database ذخیره کنین اونو باید به باینری تبدیل کرده و در بانک ذخیره کنین و وقتی میخواین نشون بدین اونو از باینری به عکس تبدیل کرده و نشونش بدین.

اگه میخواین کاری بکنین اونو به نحو احس انجام بدین نه اینکه بیاین آدرس رو در بانک عکس رو در یه گوشه ای از هارد ذخیره کنین و یه آدم آماتور بیاد اونارو حذف کنه و بی کلاه بمونین!!!

برای ذخیره عکی به صورت باینری و خوندن اون هزار تا مطلب در همین سایت هستش. یه کوچولو بگرد پیدا می کنی.

موفق باشی.
ممنون از توضیح مفصلتون. قانع شدم که از روشی که گفتید استفاده کنم. فقط یه مشکل دارم من پروژم به گونه ای هست که قراره کاربر بعد از پر کردن یک سری تکست باکس بین یک تا 50 تا عکس رو وارد پروژه کنه. باید چیکار کنم؟ در دیتابیس چند تا خانه به اون اختصاص بدم؟ راستی با این کار مشکل سرعت بوجود نمی آد؟

ACorvinus
سه شنبه 05 مرداد 1389, 18:35 عصر
سلام.

[
در دیتابیس چند تا خانه به اون اختصاص بدم؟ راستی با این کار مشکل سرعت بوجود نمی آد؟

چون نمیخوام همینجوری یه چیزی گفته باشم توصیه می کنم بری به بخش SQL و از یه طراح Database سوال کنی.
جواب این سوالاتتو اونا بهتر از من میتونن بدن.

موفق باشی.

salehvasaleh
سه شنبه 05 مرداد 1389, 18:48 عصر
سلام.

[

چون نمیخوام همینجوری یه چیزی گفته باشم توصیه می کنم بری به بخش SQL و از یه طراح Database سوال کنی.
جواب این سوالاتتو اونا بهتر از من میتونن بدن.

موفق باشی.

از لحاظ سرعت و حجم چی؟ مشکلش زیاده؟

ACorvinus
سه شنبه 05 مرداد 1389, 19:07 عصر
نه به نظرم مشکلی در حجم پیش نمیاد چون عکس به صورت 01 ذخیره میشه نه به صورت خود عکس.

بازم دوست من توصیه می کنم از یه طراح Database اینارو بپرسی. من اطلاعات زیادی ندارم.

saeedr22
سه شنبه 05 مرداد 1389, 19:32 عصر
بلی عکس رو باید به صورت باینری ذخیره کنید و از خود database اونو بخونین نه اینکه مسیرشو ذخیره کنید.

salehvasaleh
سه شنبه 05 مرداد 1389, 19:52 عصر
بلی عکس رو باید به صورت باینری ذخیره کنید و از خود database اونو بخونین نه اینکه مسیرشو ذخیره کنید.
برای یادگیری این کار آموزشی سراغ دارید که بهم معرفی کنید؟ آدرس صفحه خاص از تایپیک؟

Editali
سه شنبه 05 مرداد 1389, 19:57 عصر
نه به نظرم مشکلی در حجم پیش نمیاد چون عکس به صورت 01 ذخیره میشه نه به صورت خود عکس.


اگر برنامه تحت شبکه یا تحت وب باشه به دلیل حجم زیاد عکس ها نسبت به داده های معمول، باعث درگیری سرور برای انتقال دیتا میشه و وقتی که ترافیک بالا بره این موضوع بحرانی میشه و حتی ممکنه باعث دان شدن سرور بشهو

اگر حتی برنامه کلاینت سینگل هم باشه اگر مدیریت درستی روی داده ها نداشته باشین میتونه هم فضای زیادی از رم رو اشغال کنه و هم میتونه سرعت برنامه رو به صورت چشمگیری کاهش بده!

اگر تصمیم به ذخیره عکس تو دیتابیس گرفتی، برای اینکه سرعت برنامه پایین باید به اندازه ماکزیمم تعداد عکست فیلد ایجاد کنی. از هر فیلدی که استفاده نشه null میمونه و null فضایی به اندازه 0 اشغال میکنه!

البته میتونی یه کم پیچیدش کنی و از یه فیلد استفاده کنی که در اونصورت هم کارت سخت میشه هم ممکنه برات مشکل پیش بیاد.

salehvasaleh
سه شنبه 05 مرداد 1389, 20:48 عصر
اگر برنامه تحت شبکه یا تحت وب باشه به دلیل حجم زیاد عکس ها نسبت به داده های معمول، باعث درگیری سرور برای انتقال دیتا میشه و وقتی که ترافیک بالا بره این موضوع بحرانی میشه و حتی ممکنه باعث دان شدن سرور بشهو

اگر حتی برنامه کلاینت سینگل هم باشه اگر مدیریت درستی روی داده ها نداشته باشین میتونه هم فضای زیادی از رم رو اشغال کنه و هم میتونه سرعت برنامه رو به صورت چشمگیری کاهش بده!

اگر تصمیم به ذخیره عکس تو دیتابیس گرفتی، برای اینکه سرعت برنامه پایین باید به اندازه ماکزیمم تعداد عکست فیلد ایجاد کنی. از هر فیلدی که استفاده نشه null میمونه و null فضایی به اندازه 0 اشغال میکنه!

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

mmd2009
چهارشنبه 06 مرداد 1389, 03:57 صبح
دوست عزیز اینطور که از برنامه شما پیداست واسه هر بار 50 تا عکس رو میخواهید ذخیره کنید یعنی خیلی :چشمک:

وقتی میگن عکس رو به صورت باینزی ذخیره کنید مثلا واسه ثبت اشخاص میخواهید این کارو بکنید یه عکس 3*4 که حجم زیادی هم نداره .

وای شما انگار در برنامتون امکان ذخیره صفحه هم وجود داره :متفکر:

یعنی وقتی میخواهید 50 تا صفحه رو ذخیره بکنید احتمال اینکه برنامه واسه فردا کارشو تموم کنه هست :لبخند:

یعنی حجم داده ها زیاد میشه.

و اگر هم بخواهید از ادرس استفاده بکنید مطمئنا ذخیره خیلی راحت انجام میشه

و یک حالت دیگری هم هست اونم اینه عکس رو به صورت رشته در بیارید که این توصیه نمیشه به قول یکی از همین اعصا واسه اتوکد یا .... یه همچین چیزایی به درد میخوره.

اینم 3 نکته که یکی از دوستان گفتن




1-استفاده از نوع داده image در دیتابیس که سرعت بیشتری برای بازیابی داره ولی جای بیشتری هم میگیره
2-استفاده از کدی که عکس رو باینری میکنه و بصورت دیتا در دیتا بیس ذخیره میکنه،بعد کد دیگه ای هست که اون رو بازیابی کرده و به حالت اول برمیگردونه
3-یه راه دیگه هم اینه که عکس رو در جایی روی هارد ذخیره کنی و آدرس عکس رو تو دیتا بیس ذخیره کنی،در حقیقت آدرس عکس رو از دیتا بیس میگیری که از دوتای دیگه جای بسیار کمتری اشغال میکنه و سرعت بازیابی خوبی هم داره

هر روش مشکلات خاص خودش رو داره و به نظر من خودت هر دورو امتحان کن هر کدوم که بهتر بود همونو استفاده بکن

اینو هم در نظر داشته باش یک کاربر اماتور میتونه کل پروژه رو هم به نیستی تبدیل بکنه چه برسه به ادرس یک عکس.

با تجربه ( یعنی کسب کردن ) بیشتر میتونی خودت بعد ها دیگران رو راهنمایی بکنی. :چشمک:

Editali
چهارشنبه 06 مرداد 1389, 10:36 صبح
هدف اینه که اطلاعات تنها از طریق یک کاربر و یک سیستم بدون شبکه شدن وارد بشه و بعدا اگه خواست بک آپ بگیره و به ادامه کار رو از طریق سیستمهای دیگه انجام بده. با این شرایط به نظرتون روش ذخیره عکسها در دیتا بیس خویه یا آدرس دهی.؟؟ممنون

کاری که اگر من بودم انجام میدادم این بود:

تو مسیر نصب برنامه برای هر سال یه فولدر می ساختم، تور هر کدوم یه فولدر برای هر ماه.
هر زمان که عکس انتخاب میشه اگر برای اون روز فولدر وجود نداشت برای اون روز یه فولدر داخل فولدر ماه می ساختم، یه فولدر دیگه داخلش برای اون ساعت و دقیقه. بعد عکس ها رو توی اون فولدر میریختم، ولی با یه پسوند دیگه.

داخل دیتابیس هم فقط مسیر فایل و اگر نیاز بود نام اصلی فایل رو ذخیره میکردم.

اینجوری دسته بندی فایلا مشخصه.

به صورت درخت این شکلی میشه:

سال-------ماه--------روز-------زمان
1001-----
----------- 101-------
----------------------- 1-------
-------------------------------- 1245-----
------------------------------------------- نام فایل .پسوند
-------------------------------- 1630
----------------------- 5
----------------------- 6
----------------------- 9
----------------------- 16
----------------------- 21
----------------------- 29
----------- 102
----------- 103
----------- 104
----------- 105
----------- ...
----------- 112


برای پیدا کردن مسیر نصب:
Application.StartupPath();

برای کپی کردن فایل:
File.Copy("مسیر مبدا","مسیر مقصد");

برای چک کردن وجود فولدر:
Directory.Exist("مسیر");

برای ایجاد دایرکتوری:

Directory.CreateDirectory("مسیر");

saeedr22
چهارشنبه 06 مرداد 1389, 16:47 عصر
ذخیره مسیر و نگه داشتن عکس روی درایو کار خوبی نیست چون ممکنه اطلاعاتت از دست برن.
اگه واقعاً حجمت بالا میره می تونی روی یه دیتا بیس دیگه فقط عکس هارو ذخیره کنی.
یه مثال برات میزارم واسه ذخبره ی عکس به صورت باینری.

saeedr22
چهارشنبه 06 مرداد 1389, 16:52 عصر
private void Button1_Click(object sender, System.EventArgs e)
{

byte[] fileData = null;
if (File2 != null)
{
// Make sure the file has data.
if ((File2.PostedFile != null) && (File2.PostedFile.ContentLength > 0))
{
// Get the filename.
string fn = System.IO.Path.GetFileName(File2.PostedFile.FileNa me);
try
{
// Access the file stream and begin the upload. Store the file in a memory byte array.
Stream MyStream = File2.PostedFile.InputStream;
long iLength = MyStream.Length;
fileData = new byte[(int)MyStream.Length];
MyStream.Read(fileData, 0, (int)MyStream.Length);
MyStream.Close();
}
catch (Exception excep)
{
//return false;
}

}
}
SqlConnection MyConnection=new SqlConnection("user id=xx;password=12345;database=northwind;server=xyz");
SqlCommand MyCommand = new SqlCommand("INSERT INTO MYTABLE (IMAGE_DATA) VALUES (@doc_content)", MyConnection);
SqlParameter param1 = new SqlParameter("@doc_content", SqlDbType.Image);
param1.Value = fileData;
MyCommand.Parameters.Add(param1);
MyConnection.Open();
MyCommand.ExecuteNonQuery();
MyConnection.Close();


}

private void Button2_Click(object sender, System.EventArgs e)
{
SqlConnection MyConnection=new SqlConnection("user id=xx;password=12345;database=northwind;server=xyz");
SqlCommand MyCommand = new SqlCommand("SELECT IMAGE_DATA FROM MYTABLE WHERE ID=" + Convert.ToInt32(Selectid.Text), MyConnection);
MyConnection.Open();
SqlDataReader MyReader = MyCommand.ExecuteReader();
if (MyReader.Read())
{
byte[] m_MyImage = (byte[])MyReader["IMAGE_DATA"];
Response.BinaryWrite(m_MyImage);
}


}

saeedr22
چهارشنبه 06 مرداد 1389, 16:53 عصر
در ضمن نوع فیلد باید image باشد

salehvasaleh
چهارشنبه 06 مرداد 1389, 18:30 عصر
private void Button1_Click(object sender, System.EventArgs e)
{

byte[] fileData = null;
if (File2 != null)
{
// Make sure the file has data.
if ((File2.PostedFile != null) && (File2.PostedFile.ContentLength > 0))
{
// Get the filename.
string fn = System.IO.Path.GetFileName(File2.PostedFile.FileNa me);
try
{
// Access the file stream and begin the upload. Store the file in a memory byte array.
Stream MyStream = File2.PostedFile.InputStream;
long iLength = MyStream.Length;
fileData = new byte[(int)MyStream.Length];
MyStream.Read(fileData, 0, (int)MyStream.Length);
MyStream.Close();
}
catch (Exception excep)
{
//return false;
}

}
}
SqlConnection MyConnection=new SqlConnection("user id=xx;password=12345;database=northwind;server=xyz");
SqlCommand MyCommand = new SqlCommand("INSERT INTO MYTABLE (IMAGE_DATA) VALUES (@doc_content)", MyConnection);
SqlParameter param1 = new SqlParameter("@doc_content", SqlDbType.Image);
param1.Value = fileData;
MyCommand.Parameters.Add(param1);
MyConnection.Open();
MyCommand.ExecuteNonQuery();
MyConnection.Close();


}

private void Button2_Click(object sender, System.EventArgs e)
{
SqlConnection MyConnection=new SqlConnection("user id=xx;password=12345;database=northwind;server=xyz");
SqlCommand MyCommand = new SqlCommand("SELECT IMAGE_DATA FROM MYTABLE WHERE ID=" + Convert.ToInt32(Selectid.Text), MyConnection);
MyConnection.Open();
SqlDataReader MyReader = MyCommand.ExecuteReader();
if (MyReader.Read())
{
byte[] m_MyImage = (byte[])MyReader["IMAGE_DATA"];
Response.BinaryWrite(m_MyImage);
}


}

این کد رو باید کجا بنویسم؟ می شه با ضمیمه کردن یک دیتابیس و یک فرم بصورت عملی بگید؟ممنون

salehvasaleh
چهارشنبه 06 مرداد 1389, 18:32 عصر
اصلا چطوری از یک جدول دیگه باید کمک بگیرم؟ آیا باید هر دو جدول کلید مشترکی داشته باشند؟ممنون

saeedr22
پنج شنبه 07 مرداد 1389, 11:44 صبح
منظور من جدول نیست دیتا بیس دسگه هست یعنی 2 تا کانکشن استرینگ مجزا داشته باشی

salehvasaleh
پنج شنبه 07 مرداد 1389, 19:51 عصر
منظور من جدول نیست دیتا بیس دسگه هست یعنی 2 تا کانکشن استرینگ مجزا داشته باشی
یعنی یک دیتابیس برای گرفتن اطلاعتی نظیر شماره و تاریخ و . . . و دیتابیس دوم برای گرفتن عکس های مرتبط با هر داده ای که وارد شده؟منظورتون عکس هست یا آدرس عکس؟

Masoome_das
جمعه 08 مرداد 1389, 00:00 صبح
دوستان سلام
سولی که اینجا برای من پیش اومد
اگر برنامه ما در شبکه اجرا شود و از ذخیره تصاویر استفاده کنیم
در حالتی که تصاویر در هارد ذخیره شود برای استفاده همه کاربران در شبکه قاعدتان باید تصاویر در آدرس سرور ذخیره شود پس برای خوانش بازم هم حجم عملیات زیاد می شود
اگر هم در پایگاه داده ذخیره کنیم بازهم همین مشکل را داریم
پس چه راه حلی مناسب تر است.

saeedr22
جمعه 15 مرداد 1389, 02:42 صبح
منظورم عکس نه مسیر.بلی منطورم همینه.