PDA

View Full Version : آموزش: ذخیره تصویر در بانک (آدرس عکس ذخیره میشه و از طریق آدرس عکس را لود میکنیم)



amir200h
شنبه 15 تیر 1392, 12:56 عصر
خوب تو آموزش قبلی نحوه ذخیره کردن عکس در خود بانک رو گفتم در لینک زیر
http://barnamenevis.org/showthread.php?407117-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%AF%D8%B1-%D8%A8%D8%A7%D9%86%DA%A9-%28%D8%AF%D8%B1-%D8%AE%D9%88%D8%AF-%D8%A8%D8%A7%D9%86%DA%A9-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D9%85%DB%8C-%D8%B4%D9%88%D8%AF%29&p=1811930#post1811930

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

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

private void btnSelectImage_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();//yek shey az OpenFileDialog misazim
DialogResult result = openFileDialog1.ShowDialog(); // ba ein code panjereye OpenFileDialog ra namayesh midim vase entekhabe ax
if (result == DialogResult.OK) // khob age to panjereye OpenFileDialog ax ro entekhab konim va ok ro bezanim sharte zir ejra mishe
{
string addressPic = openFileDialog1.FileName;//ein dastor addrese axe entekhab shodaro mirize to moteghayere addressPic
pictureBox1.Image = new Bitmap(addressPic);

}
}
خوب حالا باید عکس رو کنار برنامه بریزیم. برای این کار ابتدا باید یک نام برای عکس انتخاب کنیم. بهتره عکس با نام کلید اصلی جدول نام گزاری بشه که فایل هم نام ایجاد نشه.
حالا یک نام در تکست باکس (txtid) که برای نام گزاری عکس ایجاد کرده بودیم میزاریم.
سپس در رویداد باتن ذخیره عکس کد های زیر رو میزاریم
کد زیر عکس انتخاب شده را با نامی که در (txtid) انتخاب مرده بودیم در کنار برنامه ذخیره میکنه و آدرس عکسو در تکست باکس (txtimageAddress) میریزه

pictureBox1.Image.Save(txtid.Text + ".png", System.Drawing.Imaging.ImageFormat.Png);
txtimageAddress.Text = Application.StartupPath + "\\" + txtid.Text + ".png";


خوب جالا آدرسی که در (txtimageAddress) ریخته شده رو در بانکمون میریزیم.

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

picbox.Load(ds.Tables[0].Rows[0][indexe khoneye addrese axet].ToString().Trim());


موفق باشین

mthreat.info
شنبه 15 تیر 1392, 12:59 عصر
من فکر میکنم این روش بهتره(خود عکس رو ذخیره کردن در بانک)
http://c-sharp.ir/index.php/2013-02-04-10-21-38/2013-02-04-10-22-42/195-attaching-img

amir200h
شنبه 15 تیر 1392, 13:15 عصر
حجم بانک زیاد میشه و سرعت رو میاره پایین. موفق باشین

CsharpNevisi
شنبه 15 تیر 1392, 13:23 عصر
منم با ذخیره کردن ادرس عکس موافقم ... بهتره .. !!

mz6488
شنبه 15 تیر 1392, 13:53 عصر
روش ذخیره آدرس عکس در بانک خوبه ولی باید به این هم فکر کنید که اگه کاربر بخواد یه فایل backup از عکس هاش بگیره بعدش باید چکار کنید؟

Fastdesign
شنبه 15 تیر 1392, 14:39 عصر
txtimageAddress.Text = Application.StartupPath + "\\" + txtid.Text + ".png";

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

حالا این کار را چجوری میشه انجام داد؟ راهنمایی کنید.

با تشکر

amir200h
شنبه 15 تیر 1392, 14:49 عصر
System.IO.File.Copy("مسیر فایل مبدا", "مسیر فایل مقصد", true);

Fastdesign
شنبه 15 تیر 1392, 15:13 عصر
من یه این صورت نوشتم ولی خطا میده که نمیتونه چنین مسیری رو پیدا کنه!

System.IO.File.Copy("Image" + "\\" + txtid.Text + ".png", openFileDialog1.FileName, true);

CsharpNevisi
شنبه 15 تیر 1392, 15:26 عصر
System.IO.File.Copy("Image" + "\\" + txtid.Text + ".png", openFileDialog1.FileName, true);
اینطوری بنویس .. !!

System.IO.File.Copy(Application.StartupPath + "image\" + textBox1.Text + ".jpg", OpenFileDialog1.FileName, true);

h_assefi
شنبه 15 تیر 1392, 15:47 عصر
حجم بانک زیاد میشه و سرعت رو میاره پایین. موفق باشین
شاید حجم بانک یکم زیاد بشه اما ذخیره عکس توی بانک بهتره چون اگه یه روز خواستی برنامت را شبکه کنی به مشکل بر نمی خوری و از نظر من روش بهتری هستش
من هر 2 مدلش را امتحان کردم
موفق باشید

Fastdesign
شنبه 15 تیر 1392, 15:52 عصر
System.IO.File.Copy("مسیر فایل مبدا", "مسیر فایل مقصد", true);



در اینجا اول آدرس مبدا رو می خواد بعد آدرس مقصد!!

hamid_hr
شنبه 15 تیر 1392, 16:20 عصر
در SQL server 2008 يه نوع جديد معرفي شد به نام filestream
اين نوع جديد مياد اطلاعات رو داخل فايلهايي كه مكانشو مشخص ميكنين نگه ميداره
ولي شما با select معمولي هم ميتونين به اطلاغات فايلا رو بخونين هم ميتونين مسير فايلا رو بگيرين
با اين نوع حجم ديتابيسو بالا نميره و با بك اپ گيري از فايلها هم بك اپ گرفته ميشه و برا نرم افزارهاي تحت شبكه هم مشكلي پش نمياد

http://dl.nikamooz.com/radionikamooz/RadioNikAmooz-BLOBSQL.mp3

اين يك فايل MP3 هستش كه مزيت اين نوع رو ميگه

http://www.techrepublic.com/blog/programming-and-development/use-sql-server-2008-filestream-to-work-with-blob-data/5036
اينم نحوه فعال كردن filestream

CsharpNevisi
شنبه 15 تیر 1392, 16:24 عصر
در اینجا اول آدرس مبدا رو می خواد بعد آدرس مقصد!!
خب اره دیگه ... اول مبدا بعد مقصد

Fastdesign
شنبه 15 تیر 1392, 17:22 عصر
دوستان برای استخرج نام عکس و پسوند عکس بصورت جداگانه باید چجوری براش بنویسم؟

Fastdesign
شنبه 15 تیر 1392, 20:26 عصر
دوستان کسی نمیدونه بعد از لود کردن تصویر در Picture Box ، اگه بخوام نام تصویر و پسوند تصویر را مثلا در دو تا TextBox بریزیم باید چجوری براش کد بنویسیم؟

mahtab.kamali
شنبه 15 تیر 1392, 21:44 عصر
دوستان کسی نمیدونه بعد از لود کردن تصویر در Picture Box ، اگه بخوام نام تصویر و پسوند تصویر را مثلا در دو تا TextBox بریزیم باید چجوری براش کد بنویسیم؟

private void btnload_Click(object sender, EventArgs e)
{


OpenFileDialog open = new OpenFileDialog();

open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
if (open.ShowDialog() == DialogResult.OK)
{

pictureBox1.Image = new Bitmap(open.FileName);

textBox1.Text = open.FileName;

}
}

Fastdesign
شنبه 15 تیر 1392, 21:56 عصر
private void btnload_Click(object sender, EventArgs e)
{


OpenFileDialog open = new OpenFileDialog();

open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
if (open.ShowDialog() == DialogResult.OK)
{

pictureBox1.Image = new Bitmap(open.FileName);

textBox1.Text = open.FileName;

}
}


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

amir200h
یک شنبه 16 تیر 1392, 13:44 عصر
بفرما دوست من. اول آدرس عکس رو بریز داخل تکست باکس بعد این کد رو فراخوانی کن

private void button2_Click(object sender, EventArgs e)
{
string[] split = txtAddress.Text.Split('\\');
int count=(int)split.Count();
string name="";
if(split.Count().ToString()!="0")
name =split[count-1].ToString();

string[] split1 = name.Split('.');
int count1 = (int)split1.Count();
label2.Text = split1[count1 - 1].ToString();
for (int i = 0; i < count1-1; i++)
label1.Text += split1[i].ToString();
}

Mahmoud.Afrad
یک شنبه 16 تیر 1392, 13:51 عصر
اگر قراره عکس ها همراه برنامه قابلیت جابجایی داشته باشند اصلا نباید آدرس کامل را ذخیره کرد ، چون در صورت جابجایی آدرس ها نادرست خواهند بود.

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

Fastdesign
یک شنبه 16 تیر 1392, 13:53 عصر
دوست عزیز ممنونم از توجهتون.

برای شناسایی پسوند فایل تو دلفی یک دستور داشتیم به اسم ExtractFileExt ، ولی حالا سی شارپ نمی دونم چیه!

amir200h
یک شنبه 16 تیر 1392, 14:38 عصر
خواهش میکنم. خوب روش های خیلی زیادی هست. شاید هم سی شارپ همچین قابلیتی داشته باشه ولی من بلد نباشم. اینم ی روش دیگه. روش بالا کلی بود این روش هم جالبه

private void button3_Click(object sender, EventArgs e)
{
int start = txtAddress.Text.LastIndexOf('\\') ;
start++;
string str = txtAddress.Text.Substring(start, txtAddress.Text.Length - start);
string[] split1 = str.Split('.');
int count1 = (int)split1.Count();
label2.Text = split1[count1 - 1].ToString();
for (int i = 0; i < count1 - 1; i++)
label1.Text += split1[i].ToString();
}

r. salehi
دوشنبه 17 تیر 1392, 20:48 عصر
سلام دوستان عزیز
ممنون از بحث جالبتون.
من الان دقیقا با این مسئله روبه رو هستم. باید بیشتر از 100 گیگ فایل نقشه، فایل PDF و امثالهم را در بانک SQL در شرکت، تحت شبکه سازماندهی کنم.
ذخیره آدرس فایل خوبه اما من فکر نمی کنم با این روش امکان کنترل و امنیت کامل ممکن باشه. مثلا کاربر دفتر فنی می تونه یک فایل نقشه را در بانک قرار بده اما امکان پاک کردنش را نمی خوام داشته باشه. اگر نقشه ریویژن خورد باید نقشه با رویژن جدید و فایل جدید در بانک ثبت بشه تا امکان رهگیری تغییرات وجود داشته باشه. از یک طرف من شدیدا نگران پایین امدن سرعت بانک SQL هستم. چون فکر می کنم اگر فایلهای PDF و DWG و عکسها را به بانک اضافه کنم سرعتش پایین میاد. بانک من شامل اطلاعات فرایند تولید و امثالهم هم هست که نمی خوام کوچکترین افت سرعتی در اون ایجاد بشه. خلاصه من در ابتدای کار در انتخاب روش کار موندم و نمی دونم کدوم روش را انتخاب کنم.
از طرفی طبق تحقیقات متخصری که کردم متوجه شدم که اگر اندازه فابلها حدود یک مگابایت باشه سرعت NTFS که همون سرعت دسترسی فایلهای معمولی روی هارد باشه با سرعت SQL تفاوت انچنانی نداره.
از دوستان خواهش می کنم منو راهنمایی کنند.

in_chand_nafar
دوشنبه 17 تیر 1392, 20:59 عصر
پیشنهاد من به شما استفاده از Filestream و یا Filetable (معرفی شده در 2012) است * در ضمن ذخیره آدرس در دیتابیس بوسیله برنامه نویس یعنی اختراع چرخ
به این چند تا از لینک از دوره های آنلاین به نگاهی بیاندازید
Filestream چیست؟(درس چهاردهم) (http://www.nikamooz.com/%D8%AF%D9%88%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86/%D8%AF%D9%88%D8%B1%D9%87%E2%80%8C%D9%87%D8%A7%DB%8 C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%D9%8A%D8%B3%D9%8A-%D9%82%D8%A7%D8%A8%D9%84-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF/%D8%B4%DB%8C%D8%B1-%D8%B1%D8%A7-%D8%AF%D8%B1-%D9%82%D9%81%D8%B3-%D9%86%DA%AF%D9%87-%D8%AF%D8%A7%D8%B1-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-%D9%87%D8%A7%DB%8C-backup-restore/119-filestream-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F.html)

مقایسه‌ای بین روش‌های مختلف ذخیره‌سازی BLOB ها.(درس پانزدهم) (http://www.nikamooz.com/%D8%AF%D9%88%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86/%D8%AF%D9%88%D8%B1%D9%87%E2%80%8C%D9%87%D8%A7%DB%8 C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%D9%8A%D8%B3%D9%8A-%D9%82%D8%A7%D8%A8%D9%84-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF/%D8%B4%DB%8C%D8%B1-%D8%B1%D8%A7-%D8%AF%D8%B1-%D9%82%D9%81%D8%B3-%D9%86%DA%AF%D9%87-%D8%AF%D8%A7%D8%B1-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-%D9%87%D8%A7%DB%8C-backup-restore/124-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-filestream-%D8%AF%D8%B1-sql-server-2012.html)

نحوه استفاده از Filestream در SQL Server 2012 (درس شانزدهم) (http://www.nikamooz.com/%D8%AF%D9%88%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%D8%A2%D9%86%D9%84%D8%A7%DB%8C%D9%86/%D8%AF%D9%88%D8%B1%D9%87%E2%80%8C%D9%87%D8%A7%DB%8 C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%D9%8A%D8%B3%D9%8A-%D9%82%D8%A7%D8%A8%D9%84-%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF/%D8%B4%DB%8C%D8%B1-%D8%B1%D8%A7-%D8%AF%D8%B1-%D9%82%D9%81%D8%B3-%D9%86%DA%AF%D9%87-%D8%AF%D8%A7%D8%B1-%D8%AA%DA%A9%D9%86%DB%8C%DA%A9-%D9%87%D8%A7%DB%8C-backup-restore/124-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-filestream-%D8%AF%D8%B1-sql-server-2012.html)

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

ذخیره سازی داده های باینری و چالش های مربوط به آن (http://www.nikamooz.com/%D8%A7%D9%85%DA%A9%D8%A7%D9%86%D8%A7%D8%AA/radionikamooz/61-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D8%A8%D8%A7%DB%8C%D9%86%D8%B1%DB%8C-%D9%88-%DA%86%D8%A7%D9%84%D8%B4-%D9%87%D8%A7%DB%8C-%D9%85%D8%B1%D8%A8%D9%88%D8%B7-%D8%A8%D9%87-%D8%A2%D9%86.html)

davidrobert
دوشنبه 17 تیر 1392, 21:24 عصر
کاربران گرامی .
ذخیره عکس در دیتابیس از یک جهت خوب هستش و از یک جهد خوب نیست.
از این جهت خوب وقتی عکس در دیتابیس ذخیره میشه .چون ما در سیستم مشتری مجبوریم روی 2 تا سیستم نصب کنیم یا 3 یا بیشتر اون موقع طرف وقتی میخواد اطلاعات رو ببینی بدون مشکل تصاویر در هر سیستمی میبینی چون تصاویر داخل دیتابیس ذخیره شده و طرف دیتابیس رو روی سیستم دیگه Restore یا باز گردانی میکنه تصاویر در همان سیستم نمایش داده میشه ولی وقتی تصاویر روی سیستم ذخیره بیشه و لینک بیشه با تصاویر به وسیله آدرس و نشان بده اون موقع باعث میشی مشکل پیش بیاد چون تصاویر تو سیستم دیگه هستش و موقع فراخوانی سیستم دنبال تصاویر هستش ولی پیدا نمیکنی تو وی بی 6 این مشکل رو داریم ولی تو سی شارپ امتحان نکردم ببینم این مشکل هستش یا نه.
و بخاطر همین بد هستش چون برنامه روی چند سیستم نصب میشه و موقع فراخوانی عکس با مشکل بر خورد میکنه چون تصاویر توی سیستم دیگه هستش و اطلاعات در سیستم دیگه باز گردانی شده و موقع خواندن اطلاعات سیستم ممکنه خطا بده .
برای اینکه تو دیتابیس ذخیره بیشه و سرعت سیستم پایین نه یاد بهتر هستش تو دستورات برای فراخوانی تصاویر و ذخیره شرط بگزاریم و بگیم که اگه عکس بیشتر 1MB هستش نیاورد و طرف مجبور بیشه حجم عکس کم کند و همین طور بگید و اندازه تصویر اینقد باشه تا به این صورت عکس با حجم کم ذخیره بیشه و سرعت سیستم پایین نمیاد. این طوری خیلی بهتر هستش که به طرف یه برنامه تبدیل بدید مثل format factory که طرف حجم عکس رو کم کنه و ذخیره کنه تا به دیتابیس هم فشار نه یاد و سرعت سیستم بیشتر بیشه.

r. salehi
جمعه 28 تیر 1392, 03:23 صبح
ممنون دوستان
تقریبا بعد از یکی دو هفته سرگردانی فهمیدم که روش Filestream همون چیزی هست که من می خوام. البته روش FileTable هم ادامه همون روش Filestream هست با امکاناتی بیشتر.
جالب اینجاست که اگر حجم فایلهای ذخیره شده در SQL حدود یک مگابایت باشه سرعت SQL با سرعت NTFS هم تقریبا یکی خواهد بود.
Filestream فوق العاده خوب و راحت کار می کنه و هر فرمت فایلی را میشه در اون ذخیره کرد و بازیابیش کرد انهم با امنیت کامل .

amir200h
جمعه 28 تیر 1392, 11:41 صبح
خوب دوست من اگه یاد گرفتی برای دوستان دیگه هم بزار تا همه استفاده کنن

hamix666
چهارشنبه 02 مرداد 1392, 10:42 صبح
سلام من می خوام یک عکس رو به همراه نام در بانک اکسس ذعیره کنم بعد در یک فرم دیگه با جستجو نام عکس خود عکس را نمایش دهد ممنون می شم اگه راهنمایی کنید