ورود

View Full Version : نحوه ی آپلود عکس



EHassani90
پنج شنبه 26 مرداد 1391, 17:02 عصر
سلام دوستان
من چه طوری می تونم یه عکس رو در سیلورلایت آپلود کنم، در دیتابیس ذخیرش کنم و همچنین اون رو از دیتابیس باز خوانی کنم؟

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

taghvajou
جمعه 03 شهریور 1391, 17:58 عصر
سلام به همه
با اپن فایل دیالوگ عکس رو بگیر
یه مموری استریم درست کن و فایل دریافت شده رو بریز توش
بعد یه رشته از بایت درست که به اندازه ی طول فایل.
با تابع خواند داخل مموری استریم، بایت ارئی رو پر کن.
حالا بایت اری رو بفرست سرور ساید و بریز تو یه فیلد ایمیج یا ورباینری تو دیتابیس!

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

taghvajou
چهارشنبه 08 شهریور 1391, 18:57 عصر
سلام به همه
در مورد روش ارسال به صورت تکه تکه من یه نمونه ای قبل نوشتم. براتون آپلود میکنم. اگه جایی به توضیح لازم بود بفرمایین تا عرض کنم.

EHassani90
شنبه 11 شهریور 1391, 16:44 عصر
خیلی ممنون از راهنماییتون

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

taghvajou
شنبه 11 شهریور 1391, 17:06 عصر
سلام به همه
اگه منظورتون اینه که با چه تابعی بنویسین برای ارسال بایت ارئی:
تو سرویس سمت سروت یه متد بنویس که ورودیش بایت اری باشه یعنی

[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
شنبه 11 شهریور 1391, 17:55 عصر
ممنون
این کار رو انجام دادم ولی در دیتابیس ذخیره نمی کند!!!

taghvajou
شنبه 11 شهریور 1391, 17:57 عصر
کدام کار رو؟
اولا: بریک پوینت بذار ببین داده تا کجا میرسه؟
دوما: من که اصلا در مورد ذخیره در دیتابیس چیزی نگفتم، احتمالا ایراد تو قسمت نحوه ذخیره در پایگاه داده ات است؟

EHassani90
شنبه 11 شهریور 1391, 18:08 عصر
منظورم نوشتن این کدهاست
برای ذخیره در دیتا بیس هم نوشتم:

[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
شنبه 11 شهریور 1391, 18:18 عصر
دقیقا اول تابع یه بریک پوینت بذار و بگو آیا بایت ارئی با طول درست این سمت میاد یا نه تا من باقیش رو بگم؟

EHassani90
شنبه 11 شهریور 1391, 18:25 عصر
عمل تبدیل به بایت رو درست انجام میده ولی break point که اول این تابع گذاشتم اصلا کار نمی کنه! انگار اصلا وارد این تابع نمیشه تا عمل ذخیره در دیتابیس رو انجام بده

EHassani90
شنبه 11 شهریور 1391, 18:32 عصر
break point ی که ابتدای این تابع میذارم اصلا کار نمی کنه یعنی اصلا وارد این تابع نمیشه که بخواد عملیات ذخیره سازی رو انجام بده

taghvajou
یک شنبه 12 شهریور 1391, 07:23 صبح
مرورگری که باهاش اجرا میکنی فایرفاکسه؟ چون وقتی با فایرفاکس (به عنوان مرورگر دیفالت) برنامه اجرا میشه، تو بریک پوینت ها نمی ایستد!
و اینکه آیا پریک پوینت هم سرور ساید کار نمیکنه هم کلاینت ساید؟

EHassani90
پنج شنبه 30 شهریور 1391, 11:11 صبح
مرورگرم فایر فاکس هست
چه طور باید تغییرش بدم به internet explorer تا break point ها کار کنن؟

taghvajou
جمعه 31 شهریور 1391, 21:28 عصر
سلام
به عکس پیوستی یه نگاه بنداز لطفا

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

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

The remote server returned an error: NotFound

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

EHassani90
دوشنبه 10 مهر 1391, 18:36 عصر
من کجا باید برنامم رو بذارم ببینید؟
میشه شما ایمیلتون رو به من بگید تا برنامه رو براتون بفرستم؟ من تمام کارم به خاطر این مشکل آپلود عکس و ذخیره و بازیابیش از دیتا بیس مونده! یعنی تمام قسمت های وب سایتم رو طراحی کردم ولی قسمت های مربوط به عکس رو خالی گذاشتم! از هر کس دیگه ای هم پرسیدم نتونست کمکم کنه! شما تا الان هم خیلی لطف کردین که جواب سوالام رو دادید، خیلی ممنون میشم اگه برنامم رو ببینید.

با تشکر

taghvajou
سه شنبه 11 مهر 1391, 00:39 صبح
سلام جناب حسنی
آدرس ایمیل بنده taghvajou ات جیمیل یاهو لایو هات میل فیس بوک اسکایپ توییتر اووو و ... :قهقهه:
شما به جیمیل بفرست.

EHassani90
چهارشنبه 12 مهر 1391, 21:21 عصر
سلام ، فرستادم
بازم ممنون

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



ذیلا من تابعی که خودم ازش استفاده میکنم رو خدمتتون تقدیم میکنم.
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;
}