سلام دوستان
من چه طوری می تونم یه عکس رو در سیلورلایت آپلود کنم، در دیتابیس ذخیرش کنم و همچنین اون رو از دیتابیس باز خوانی کنم؟
با تشکر فراوان
سلام دوستان
من چه طوری می تونم یه عکس رو در سیلورلایت آپلود کنم، در دیتابیس ذخیرش کنم و همچنین اون رو از دیتابیس باز خوانی کنم؟
با تشکر فراوان
سلام به همه
با اپن فایل دیالوگ عکس رو بگیر
یه مموری استریم درست کن و فایل دریافت شده رو بریز توش
بعد یه رشته از بایت درست که به اندازه ی طول فایل.
با تابع خواند داخل مموری استریم، بایت ارئی رو پر کن.
حالا بایت اری رو بفرست سرور ساید و بریز تو یه فیلد ایمیج یا ورباینری تو دیتابیس!
بهترین روش استفاده از HttpHandler ها به صورت Async هست که فایل ها رو به صورت chunk بشکونه و ارسال کنه اما چون این روش پیچیده است توضیح نمیدم. بهتره خود تون در موردش تحقیق کنید. و یاد بگیرید
سلام به همه
در مورد روش ارسال به صورت تکه تکه من یه نمونه ای قبل نوشتم. براتون آپلود میکنم. اگه جایی به توضیح لازم بود بفرمایین تا عرض کنم.
آخرین ویرایش به وسیله taghvajou : چهارشنبه 08 شهریور 1391 در 20:03 عصر دلیل: ضمیمه کردن سورس
خیلی ممنون از راهنماییتون
فقط اینکه نمی دونم چطوری باید "بایت اری رو بفرستم به سرور ساید"، ( همون طور که آقای 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);
اگه منظور دیگه ای دارین، یه کم شفاف تر بفرمایین.
آخرین ویرایش به وسیله taghvajou : شنبه 11 شهریور 1391 در 18:18 عصر
ممنون
این کار رو انجام دادم ولی در دیتابیس ذخیره نمی کند!!!
کدام کار رو؟
اولا: بریک پوینت بذار ببین داده تا کجا میرسه؟
دوما: من که اصلا در مورد ذخیره در دیتابیس چیزی نگفتم، احتمالا ایراد تو قسمت نحوه ذخیره در پایگاه داده ات است؟
منظورم نوشتن این کدهاست
برای ذخیره در دیتا بیس هم نوشتم:
[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) است. پس از دریافت عکس و تبدیل آن به بایت اری این تابع را صدا زده ام.
دقیقا اول تابع یه بریک پوینت بذار و بگو آیا بایت ارئی با طول درست این سمت میاد یا نه تا من باقیش رو بگم؟
عمل تبدیل به بایت رو درست انجام میده ولی break point که اول این تابع گذاشتم اصلا کار نمی کنه! انگار اصلا وارد این تابع نمیشه تا عمل ذخیره در دیتابیس رو انجام بده
break point ی که ابتدای این تابع میذارم اصلا کار نمی کنه یعنی اصلا وارد این تابع نمیشه که بخواد عملیات ذخیره سازی رو انجام بده
مرورگری که باهاش اجرا میکنی فایرفاکسه؟ چون وقتی با فایرفاکس (به عنوان مرورگر دیفالت) برنامه اجرا میشه، تو بریک پوینت ها نمی ایستد!
و اینکه آیا پریک پوینت هم سرور ساید کار نمیکنه هم کلاینت ساید؟
مرورگرم فایر فاکس هست
چه طور باید تغییرش بدم به internet explorer تا break point ها کار کنن؟
سلام
به عکس پیوستی یه نگاه بنداز لطفا
سلام مشکلش رو پیدا کردم ولی نمی دونم یعنی چی!!!
break point که گذاشتم، عکس رو در آرایه byte درست ریخت و این آرایه رو مقدار دهی کرد اما وارد تابع ImageAsync(byte که در صفحه ی قبل نوشتیم و برای ذخیره عکس در دیتابیس بود، نشد و این error رو داد:
در کلاس Reference.cs خط ; (base.EndInvoke("Image", _args, result ، را سبز رنگ کرده و خطای زیر را در کادر پایین آن نوشت :
The remote server returned an error: NotFound
سلام، اگه ممکنه سورست روآپلود کن تا ببینیم دردش چیه؟
دلایلی زیاد میتونه داشته باشه! اینکه گویا نیست به خاطر اینه که بعضی از استثناها تو ویژوال استودیو خوب مدیریت نشدن. البته میتونین تو کانفیگ پروژه تنظیم کنه که به صورت یه لوگ تریس ذخیره بشه.
آخرین ویرایش به وسیله taghvajou : شنبه 08 مهر 1391 در 16:29 عصر
من کجا باید برنامم رو بذارم ببینید؟
میشه شما ایمیلتون رو به من بگید تا برنامه رو براتون بفرستم؟ من تمام کارم به خاطر این مشکل آپلود عکس و ذخیره و بازیابیش از دیتا بیس مونده! یعنی تمام قسمت های وب سایتم رو طراحی کردم ولی قسمت های مربوط به عکس رو خالی گذاشتم! از هر کس دیگه ای هم پرسیدم نتونست کمکم کنه! شما تا الان هم خیلی لطف کردین که جواب سوالام رو دادید، خیلی ممنون میشم اگه برنامم رو ببینید.
با تشکر
سلام جناب حسنی
آدرس ایمیل بنده 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;
}