# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > Silverlight >  نحوه ی آپلود عکس

## EHassani90

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

با تشکر فراوان

----------


## taghvajou

سلام به همه
با اپن فایل دیالوگ عکس رو بگیر
یه مموری استریم درست کن و فایل دریافت شده رو بریز توش
بعد یه رشته از بایت درست که به اندازه ی طول فایل.
با تابع خواند داخل مموری استریم، بایت ارئی رو پر کن. 
حالا بایت اری رو بفرست سرور ساید و بریز تو یه فیلد ایمیج یا ورباینری تو دیتابیس!

----------


## d_derakhshani

بهترین روش استفاده از HttpHandler ها به صورت Async هست که فایل ها رو به صورت chunk بشکونه و ارسال کنه اما چون این روش پیچیده است توضیح نمیدم. بهتره خود تون در موردش تحقیق کنید. و یاد بگیرید

----------


## taghvajou

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

----------


## EHassani90

خیلی ممنون از راهنماییتون

فقط اینکه نمی دونم چطوری باید "بایت اری رو بفرستم به سرور ساید"، ( همون طور که آقای taghvajou فرمودند) می شه در این مورد هم راهنمایی بفرمایید
باز هم ممنون

----------


## taghvajou

سلام به همه
اگه منظورتون اینه که با چه تابعی بنویسین برای ارسال بایت ارئی:
تو سرویس سمت سروت یه متد بنویس که ورودیش بایت اری باشه یعنی 

[OperationContract]
public bool SendImage (byte[] img)
{
// save in to database
// if successful return True, if Failure return False
}


اگه منظورتون اینه که به چه روشی عکس رو به بایت ارئی تبدیل کنین:
که نمونه اش تو همون سورسی که تو پاسخ قبلی گذاشته بودم، میتونستین پیدا کنین

            OpenFileDialog dlg = new OpenFileDialog();
            dlg.ShowDialog();
            FileStream file = dlg.File.OpenRead();
            byte[] byt = new byte[file.Length];
            file.Read(byt, 0, (int)file.Length);



اگه منظور دیگه ای دارین، یه کم شفاف تر بفرمایین. :متفکر:

----------


## EHassani90

ممنون
این کار رو انجام دادم ولی در دیتابیس ذخیره نمی کند!!!

----------


## taghvajou

کدام کار رو؟ 
اولا: بریک پوینت بذار ببین داده تا کجا میرسه؟
دوما: من که اصلا در مورد ذخیره در دیتابیس چیزی نگفتم، احتمالا ایراد تو قسمت نحوه ذخیره در پایگاه داده ات است؟

----------


## EHassani90

منظورم نوشتن این کدهاست 
برای ذخیره در دیتا بیس هم نوشتم:

 [OperationContract]
        public bool Image(byte[] img)
        {
            Table<User_Info> user = d.GetTable<User_Info>();
            User_Info u = new User_Info();
            u.Image = img;
            user.InsertOnSubmit(u);
            d.SubmitChanges();
            return true;
        }


user_Info اسم یه جدول در دیتابیسم هست که فعلا دو فیلد ID و Image را دارد . فیلد ID نیز identity می باشد و فیلد Image هم از نوع varbinary(Max) است. پس از دریافت عکس و تبدیل آن به بایت اری این تابع را صدا زده ام.

----------


## taghvajou

دقیقا اول تابع یه بریک پوینت بذار و بگو آیا بایت ارئی با طول درست این سمت میاد یا نه تا من باقیش رو بگم؟

----------


## EHassani90

عمل تبدیل به بایت رو درست انجام میده ولی break point که اول این تابع گذاشتم اصلا کار نمی کنه! انگار اصلا وارد این تابع نمیشه تا عمل ذخیره در دیتابیس رو انجام بده

----------


## EHassani90

break point ی که ابتدای این تابع میذارم اصلا کار نمی کنه یعنی اصلا وارد این تابع نمیشه که بخواد عملیات ذخیره سازی رو انجام بده

----------


## taghvajou

مرورگری که باهاش اجرا میکنی فایرفاکسه؟ چون وقتی با فایرفاکس (به عنوان مرورگر دیفالت) برنامه اجرا میشه، تو بریک پوینت ها نمی ایستد!
و اینکه آیا پریک پوینت هم سرور ساید کار نمیکنه هم کلاینت ساید؟

----------


## EHassani90

مرورگرم فایر فاکس هست
چه طور باید تغییرش بدم به internet explorer تا break point ها کار کنن؟

----------


## taghvajou

سلام
به عکس پیوستی یه نگاه بنداز لطفا

----------


## EHassani90

سلام مشکلش رو پیدا کردم ولی نمی دونم یعنی چی!!!
break point که گذاشتم، عکس رو در آرایه byte درست ریخت و این آرایه رو مقدار دهی کرد اما وارد تابع ImageAsync(byte که در صفحه ی قبل نوشتیم و برای ذخیره عکس در دیتابیس بود، نشد و این error رو داد:

در کلاس Reference.cs  خط     ; (base.EndInvoke("Image", _args, result ، را سبز رنگ کرده و خطای زیر را در کادر پایین آن نوشت :

The remote server returned an error: NotFound

----------


## taghvajou

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

----------


## EHassani90

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

با تشکر

----------


## taghvajou

سلام جناب حسنی
آدرس ایمیل بنده taghvajou ات جیمیل یاهو لایو هات میل فیس بوک اسکایپ توییتر اووو و ...  :قهقهه: 
شما به جیمیل بفرست.

----------


## EHassani90

سلام ، فرستادم
بازم ممنون

----------


## taghvajou

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


 ذیلا من تابعی که خودم ازش استفاده میکنم رو خدمتتون تقدیم میکنم.          public static byte[] CompressImage(byte[] bytes, double maxHeight, double maxWidth)
          {
              byte[] _result;
  
              BitmapImage bitmap = new BitmapImage();
              bitmap.SetSource(ConvertBytesToStream(bytes));
              System.Windows.Controls.Image image = new System.Windows.Controls.Image();
              image.Effect = new DropShadowEffect()
              {
                  BlurRadius = 0,
                  ShadowDepth = 0
              };
              image.Source = bitmap;
  
              double scaleX = 1;
              double scaleY = 1;
  
              if (bitmap.PixelWidth > maxWidth)
                  scaleX = maxWidth / bitmap.PixelWidth;
              if (bitmap.PixelHeight > maxHeight)
                  scaleY = maxHeight / bitmap.PixelHeight;
  
              double scale = Math.Min(scaleY, scaleX);
              ScaleTransform ss = new ScaleTransform() { ScaleX = scale, ScaleY = scale };
              int newWidth = Convert.ToInt32(bitmap.PixelWidth * scale);
              int newHeight = Convert.ToInt32(bitmap.PixelHeight * scale);
              WriteableBitmap resultBitmap = new WriteableBitmap(newWidth, newHeight);
              resultBitmap.Render(image, new ScaleTransform() { ScaleX = scale, ScaleY = scale });
              resultBitmap.Invalidate();
              _result = ConvertStreamToByte(JpegEncode(resultBitmap, 40));
  
              return _result;
          }

----------

