PDA

View Full Version : سوال: چطور عکس مربوط به دانش آموز رو در دیتابیس وارد کنم؟



ABZiko
شنبه 09 خرداد 1394, 11:38 صبح
سلام، بنده دارم یک نرم افزار برای دانش آموزان درست می کنم، می خوام برای هر کدومشون یک فیلد عکس بزارم که در کنار دیگر مشخصاتشان نمایش داده شود ... حالا فیلد رو گذاشتم و OpenDialog رو هم گذاشتم، حالا چی کار باید بکنم که عکس هر دانش آموز ذخیره بشه و اون رو برای هر دانش آموزش در جدول نمایش بدم؟ (از Access استفاده می کنم)

محمد رضا فاتحی
شنبه 09 خرداد 1394, 11:43 صبح
می خواین خود عکس رو ذخیره کنید؟؟ یا بصورت آدرس باشه؟؟

ABZiko
شنبه 09 خرداد 1394, 11:47 صبح
کدوم روش بهتره؟، توی PHP که ما آدرس رو ذخیره می کنیم، حالا این جا رو نمی دونم کدوم بهتره ...

ABZiko
شنبه 09 خرداد 1394, 13:37 عصر
دوستان می شه کمک کنید ...

sg.programmer
شنبه 09 خرداد 1394, 13:55 عصر
کدوم روش بهتره؟، توی PHP که ما آدرس رو ذخیره می کنیم، حالا این جا رو نمی دونم کدوم بهتره ...

بستگی به کارت داره ولی آدرس بهتره.
با آدرس که مثل یک فیلد معمولی رفتار میکنی.

ABZiko
شنبه 09 خرداد 1394, 14:12 عصر
می شه بیشتر توضیح بدین، مثلا چطور فایل رو که با Dialog وارد کردیم رو فقط اسمش رو وارد جدول کنم، از طرفی چطور در عین این که جداول رو ثبت می کنم، عکس رو به یک پوشه خاص منتقل کنم؟

ebrahim.rayatparvar
شنبه 09 خرداد 1394, 15:24 عصر
سلام مهندس جان.
من هنوز اکسس کار نکردم با SQL کار کردم و زمانی که من بخوام عکسی رو ذخیره کننم به خصوص تحت شبکه از ذخیره کردن عکس تو دیتابیس استفاده می کنم البته اول به صورت باینری می کنم بعد ذخیره می کنم

asman.abi
شنبه 09 خرداد 1394, 16:37 عصر
همان طور که گفته شد 2 راه وجود داره.
1. آدرس عکس مورد نظر
2.ذخیره عکس به صورت باینری در پایگاه داده

روش اول مثل کار هایی که انجام می دادی هست. یعنی وقتی OPENFILEDIALOG باز میشه آدرس محل ذخیره عکس رو میگیری.
این جوری
OpenFileDialog o = new OpenFileDialog();

if (o.ShowDialog() != DialogResult.Cancel)

string filename = o.FileName;
این کد مسیر و نام فایل رو میگیره و در متغیر filename ذخیره میکه و شما این متغیر رشته ای خیلی راحت در پایگاه قرار می دی.
و موقع بازیابی هم آدرس اون رو از پایگاه می خونی بعد توسط دستور زیر نمایش می دی.

System.Diagnostics.Process.Start(file_path)

روش دوم ابتدا فایل رو می خونی با یه stream ای و داده های اونو در یه متغیر باینری ذخیره می کنی و بعد روال ذخیره در پایگاه داده. این روش بهتره البته بستگی به کار شما داره. خواستی بیشتر توضیح می دم.

god of war
شنبه 09 خرداد 1394, 17:14 عصر
سلام
دوستان چرا روش دوم بهتره ؟
دلیل برتریش نسبت به آدرس چیه ؟

asman.abi
شنبه 09 خرداد 1394, 17:26 عصر
سلام
دوستان چرا روش دوم بهتره ؟
دلیل برتریش نسبت به آدرس چیه ؟

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

اینا مهمترینش بود

god of war
شنبه 09 خرداد 1394, 17:33 عصر
باعث افزایش حجم database نمیشه ؟

ebrahim.rayatparvar
شنبه 09 خرداد 1394, 18:22 عصر
سلام
دوستان چرا روش دوم بهتره ؟
دلیل برتریش نسبت به آدرس چیه ؟
سلام مهندس جان.
باید در مورد ذخیره کردن در دیتابیس باید بگم اولن فکر کن یه برنامه نوشتی تحت سرور و هر کلاینتی از داخل کامپیوتر خودش میاد یه عکسی رو ذخیره می کنه اون وقت به نظرت میشه به واسته آدرس باهاش کار کرد؟؟
بعد در مورد حجم اولن که باینری میکنی بعد دوما حتما نباید با حجم بالا ذخیره کنی خود من برای رخیره تو دیتابیس شرط میزارم که حجم بالای 200 کیلو بایت نباشه مگر جایی که عکس واقعا نیاز کاربر باشه که با کیفیت بالا ببینه.

god of war
شنبه 09 خرداد 1394, 18:27 عصر
ممنون مهندس
میشه یک سیر آموزشی کامل با دستوراتش بزارید
ممنونتون میشم

ebrahim.rayatparvar
شنبه 09 خرداد 1394, 18:33 عصر
آموش چی؟؟؟
پروژه ذخیره عکس در دیتابیس؟؟

ebrahim.rayatparvar
شنبه 09 خرداد 1394, 18:39 عصر
من برای تبدیل عکس به باینری یا بر عکس تو برنامه ها از این 2 متد تو برنامه ها استفاده میکنم یه کلاس می کنم تو کل برنامه استفاده می کنم.

تبدیل عکس به باینری :


public static byte[] ImageToByte(Image img) //--------- تبدیل عکس به باینری -------------
{
byte[] byteArray = new byte[0];
using (MemoryStream stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Close();
byteArray = stream.ToArray();
}
return byteArray;
}


تبدیل باینری به عکس :


public static Bitmap binaryToBitmap(DataTable dt,int i,string j)
{
MemoryStream MS = new MemoryStream((byte[])dt.Rows[i][j]);
Bitmap bmpBitmap = new Bitmap(MS);
return bmpBitmap;
}


i : برای سطر datatable
j : برای ستون datatable که داخل هر بخش امکان داره متفاوت باشه

khokhan
شنبه 09 خرداد 1394, 23:38 عصر
سلام مهندس جان.
باید در مورد ذخیره کردن در دیتابیس باید بگم اولن فکر کن یه برنامه نوشتی تحت سرور و هر کلاینتی از داخل کامپیوتر خودش میاد یه عکسی رو ذخیره می کنه اون وقت به نظرت میشه به واسته آدرس باهاش کار کرد؟؟
بعد در مورد حجم اولن که باینری میکنی بعد دوما حتما نباید با حجم بالا ذخیره کنی خود من برای رخیره تو دیتابیس شرط میزارم که حجم بالای 200 کیلو بایت نباشه مگر جایی که عکس واقعا نیاز کاربر باشه که با کیفیت بالا ببینه.

نظر همه دوستان محترم ، اما کمتر سایتی رو می تونین پیدا کنین که بخواهد تصاویر رو درون دیتابیس ذخیره کنه

دیوما ، چی گفته که نمی شه تصاویر باینری رو در مسیری غیر از بانک ذخیره کرد

با همه این اوصاف شرایط و کارکردهایی که در موقعیتهای مختلف بوجود می اد تکنیک خاص خودش رو طلب می کنه

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

نمونه ذخیره وبازیابی ومدیریت تصاویر ذخیره شده در محلی خارج از دیتابیس رو ضمیمه می کنم

asman.abi
یک شنبه 10 خرداد 1394, 00:02 صبح
برای راه دوم که گفتم من در یک موضوعی در این تالار گفتم به آدرس زیر مراجعه کنید.

http://barnamenevis.org/showthread.php?492083-%D9%88%D8%B1%D9%88%D8%AF%DB%8C-%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D9%81%D8%A7%DB%8C%D9%84-%D9%85%D8%AA%D9%86%DB%8C-%D8%A7%D8%B2-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86&p=2220805&viewfull=1#post2220805

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


دیوما ، چی گفته که نمی شه تصاویر باینری رو در مسیری غیر از بانک ذخیره کرد

با همه این اوصاف شرایط و کارکردهایی که در موقعیتهای مختلف بوجود می اد تکنیک خاص خودش رو طلب می کنه

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


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

asman.abi
یک شنبه 10 خرداد 1394, 00:07 صبح
من برای تبدیل عکس به باینری یا بر عکس تو برنامه ها از این 2 متد تو برنامه ها استفاده میکنم یه کلاس می کنم تو کل برنامه استفاده می کنم.

تبدیل عکس به باینری :


public static byte[] ImageToByte(Image img) //--------- تبدیل عکس به باینری -------------
{
byte[] byteArray = new byte[0];
using (MemoryStream stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Close();
byteArray = stream.ToArray();
}
return byteArray;
}


تبدیل باینری به عکس :


public static Bitmap binaryToBitmap(DataTable dt,int i,string j)
{
MemoryStream MS = new MemoryStream((byte[])dt.Rows[i][j]);
Bitmap bmpBitmap = new Bitmap(MS);
return bmpBitmap;
}


i : برای سطر datatable
j : برای ستون datatable که داخل هر بخش امکان داره متفاوت باشه

در مورد این جا کار شما خوبه ولی باید فایل دریافتی حتما به صورت عکس شده باشه. منظورم از نوع image باشه.

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

khokhan
یک شنبه 10 خرداد 1394, 01:38 صبح
چند دلیل استفاده نکردن از این روش رو گفتم پس بهترین نیست. نرم افزار شما فقط ملزم به اجرا در سیستم خودتان می شود.

هست .......چرانیست:لبخند:

using System.IO

if (!Directory.Exists(yourDirectory))
Directory.CreateDirectory(yourDirectory);

محمد رضا فاتحی
یک شنبه 10 خرداد 1394, 07:15 صبح
بستگی داره...اگه عکس ها برای کارکرد نرم افزار حیاتی است مثلا فرض کنید نرم افزار شما تحت شبکس و قراره از عکس ها همهه کاربرها استفاده کنند، بهترین راه ذخیره در خود دیتابیسه که محدودیتهایی هم داره مثلا حجم... ولی اگه صرفا جهت نمایش و کارهای معمولیه مثلا ذخیره عکس پرسنلی کاربر روش معقولی نیست که در دیتابیس ذخیره بشه

ebrahim.rayatparvar
یک شنبه 10 خرداد 1394, 11:22 صبح
روش های زیادی است برای ذخیره کردن عکس و برای زمانی که باینری ذخیره میشه ما هم نگفتیم فقط در بانک میشه درست چندین حالت داره ولی بهترین روش در باینری کردن و ذخیره کردن در دیتابیس است.
و یک سایت با یه برنامه WinForm خیلی فرق داره چون اگه شما بخواین عکس ذخیره کنین اون رو آپلود می کنید ولی تو برنامه WinForm بخصوص تحت شبکه مطمنا منطقی نیست. باید در بان ذخیره بشه.
در مورد سوال دوستمون در مورد image اینکه کلامشون کاملا منطقی و درسته ولی کدی که نوشتم گفتم تو برنامه من این جور می نویسم فقط یاد آوری نکردم من فقط اینجا عکس میگیرم فایل دیگه ای نمی گیرم. ولی این هم هست برای برگردوندن باینری به فایل مورد نظر چه کاری انجام میدین؟؟؟

winner1
یک شنبه 10 خرداد 1394, 13:55 عصر
هست .......چرانیست:لبخند:

using System.IO

if (!Directory.Exists(yourDirectory))
Directory.CreateDirectory(yourDirectory);


سلام رفیق الان ملاک شما سایت ولی باید یه برنامه ویندوز فرم رو در نظر بگیری که قراره تحت شبکه کار کنه

khokhan
یک شنبه 10 خرداد 1394, 16:21 عصر
سلام رفیق الان ملاک شما سایت ولی باید یه برنامه ویندوز فرم رو در نظر بگیری که قراره تحت شبکه کار کنه
خب بشه .....
وقتی تصویر کد گذاری می شه به عنوان یک پارامتر از کلاینت به سرور ارسال می شه تا توی بانک ریخته بشه ... حالا خیلی سخته شما اونو توی سرور به جای ذخیره در بانک بریزین توی یه پوشه ؟؟؟؟!
نکنه می خوای توی کلاینت ها به طور جداگانه ذخیره کنی :متعجب:

winner1
یک شنبه 10 خرداد 1394, 16:35 عصر
خب بشه .....
وقتی تصویر کد گذاری می شه به عنوان یک پارامتر از کلاینت به سرور ارسال می شه تا توی بانک ریخته بشه ... حالا خیلی سخته شما اونو توی سرور به جای ذخیره در بانک بریزین توی یه پوشه ؟؟؟؟!
نکنه می خوای توی کلاینت ها به طور جداگانه ذخیره کنی :متعجب:
میشه یه مثال از این بهمون بدین فکر کنم مشکل اساسیه خیلی از ماهاست

asman.abi
یک شنبه 10 خرداد 1394, 23:31 عصر
روش های زیادی است برای ذخیره کردن عکس و برای زمانی که باینری ذخیره میشه ما هم نگفتیم فقط در بانک میشه درست چندین حالت داره ولی بهترین روش در باینری کردن و ذخیره کردن در دیتابیس است.
و یک سایت با یه برنامه WinForm خیلی فرق داره چون اگه شما بخواین عکس ذخیره کنین اون رو آپلود می کنید ولی تو برنامه WinForm بخصوص تحت شبکه مطمنا منطقی نیست. باید در بان ذخیره بشه.
در مورد سوال دوستمون در مورد image اینکه کلامشون کاملا منطقی و درسته ولی کدی که نوشتم گفتم تو برنامه من این جور می نویسم فقط یاد آوری نکردم من فقط اینجا عکس میگیرم فایل دیگه ای نمی گیرم. ولی این هم هست برای برگردوندن باینری به فایل مورد نظر چه کاری انجام میدین؟؟؟

منظورتون چیه؟ یعنی وقتی تو پایگاه ذخیره کردی می خوای بازیابیش کنی؟
:متفکر:

ebrahim.rayatparvar
دوشنبه 11 خرداد 1394, 10:48 صبح
منظورتون چیه؟ یعنی وقتی تو پایگاه ذخیره کردی می خوای بازیابیش کنی؟
:متفکر:
درسته حالا فایل های متفاوتی داری با پسوند های متفاوت برای بازیابی چه کاری انجام میدین؟؟؟

asman.abi
دوشنبه 11 خرداد 1394, 12:49 عصر
من برای این کار باید ابتدا یه توضیحی درباره فایل ها بدم.
به طور مثال هنگامی که یه فایل pdf ساخته میشه و یه فایل در هارد قرار می گیره به صورت باینری هست(ترکیبی از یک ها و صفر ها). حال سیستم عامل از کجا می فهمه این pdf هست این عکس هست ویا هر نوع دیگه ایی. به طور معمول یه بایت از اول هر فایلی معرف نوع اون فایله(گفتم به طور معمول در بعضی مواقع بیشتر هم هست مثلا تو همین pdf) تو pdf نسخه های متفاوتی هست پس به نوع pdf در ابتدای فایل اضافه میشه و یکم بیشتر از بایت میشه.:لبخندساده:

خب در ویکی پدیا می تونی تمام بایت هایی که معرف نوع فایل هست رو ببینی.

من این جور رفتار کردم برای شناسایی فایلی با پسوند pdf در پایگاه داده

fileData = new byte[4];
st.Read(fileData,0,4);

string s = BitConverter.ToString(fileData); //convert byte to string

if (s == "25-50-44-46") //hex any pdf compare with s
عملیات شما

در حقیقت کد hex فایل های pdf صرف نظر از نسخه pdf به صورت "0x25504446" هست که من ابتدای اون رو تشخیص میدم و می فهمم از چه نوعی هست. حال برای فایل های دیگه با کد مخصوص به خودش همین روال انجام میشه.

ebrahim.rayatparvar
دوشنبه 11 خرداد 1394, 13:06 عصر
پس باید ببینیمم کد hex ما تو کدوم یک از کیس هایی که دارم هست باز دوباره همون کد کانورت رو براش میزنیم.

asman.abi
دوشنبه 11 خرداد 1394, 17:58 عصر
بله . همین طوره.
روش خوبیه . اینو چقدر فکر کردم بعد از تبدیل های مختلف به این نتیجه رسیدم.

اینو گذاشتم به عنوان آموزش برای همه
باشد تا دعای خیری و توشه اخروی برایم شود.