PDA

View Full Version : سوال: نحوه خواندن عکس از روی سرور



hahaie
پنج شنبه 02 اردیبهشت 1395, 10:55 صبح
سلام دوستان...
یه نرم افزار نوشته شده فرض کنین توی یه فرماش اطلاعات کارمندان رو نگه داری میکنه من جمله آدرس عکس کارمند روی سرور.یعنی اینکه توی جدول کارمندان یه فیلد تعریف میکنم یه محتواش آدرس عکس کارمند روی سرور هست.
حالا میخوام توی فرم مربوط به کاربران یه PictureBox ی بذارم که عکس هر کاربری که از GridView انتخاب میشه از روی سرور خونده بشه و داخل اون نشون داده بشه.
اول اینکه نظرتون در مورد این روش چیه؟
دوم اینکه چطوری برای pictureBox تعیین کنم مسیر فایل روی سرور رو؟
در این صورت مجبورم یه آدرس پیش فرض برای عکس های کارمندان روی سرور درست کنم و نام هر عکس رو برابر کد پرسنلی کارمند قرار بدم.منتها ایرادش اینه که کسی از روی نسخه کلاینت نمیتونه فیلد عکس مربوط به هر کاربر رو ویرایش کنه یا برای کاربر جدید عکسی تعریف کنه و مدیر مجبور میشه عکس کاربر جدید رو خودش به صورت دستی روی سرور توی همون پوشه و با نام کد پرسنلی قرار بده(روشش زیاد به نظر من جالب نیست)

Felony
یک شنبه 05 اردیبهشت 1395, 13:27 عصر
کد پرسنلی کاربر رو که برنامه داره !
موقع ویرایش یا قرار دادن عکس جدید اتوماتیک عکس قبلی رو حذف کنید و عکس جدید رو با کد پرسنلی تو پوشه سرور ذخیره کنید .

* کلا در هر سناریویی حذف کردن اطلاعات اشتباه هست مگر با منطق و دلیل محکم - در موردی که شما گفتید بهتره یه پوشه مثلا Avatars داشته باشید و داخل اون زیر پوشه هایی با کد پرسنلی افراد که داخل اون پوشه عکس افراد با تاریخ یا عدد ثبت بشه و موقع دانلود رو سیستم کلاینت هم اخرین عکس پوشه رو تحویل کلاینت بدید تا آرشیوی از عکس ها داشته باشید .

البته این یه پشنهاد بود و من سناریو شما رو دقیق نمیدونم و نمیدونم میخواین چی کار کنید . شاید اصلا این آرشیو به کارتون نیاد و نیازی بهش نباشه .

hahaie
سه شنبه 07 اردیبهشت 1395, 05:25 صبح
خب درست حالا فرض کنید کلاینت میخواد یه کارمند جدید ایجاد کنه و یه عکس براش انتخاب میکنه(از روی سیستم خودش).حالا این عکس رو چطوری روی سرور(توی یه پوشه) یا روی دیتابیس ذخیره کنیم؟

حسین.کاظمی
سه شنبه 07 اردیبهشت 1395, 12:24 عصر
سلام
منم چند سال پیش یک نرم افزار برای بهره برداری و امور پرسنلی یک کارخانه نوشتم برای ذخیره عکس پرسنل کاملا اشتباه است که آدرس عکس را ذخیره کنیم؛بهترین، مناسبترین،حرفه ایی ترین روش ذخیره عکس در بانک اطلاعاتی است.

sinaprog
سه شنبه 07 اردیبهشت 1395, 13:59 عصر
سلام
منم چند سال پیش یک نرم افزار برای بهره برداری و امور پرسنلی یک کارخانه نوشتم برای ذخیره عکس پرسنل کاملا اشتباه است که آدرس عکس را ذخیره کنیم؛بهترین، مناسبترین،حرفه ایی ترین روش ذخیره عکس در بانک اطلاعاتی است.
منم موافقم ولی اپه میخواین این کار روکنید برای ذخیره عکس دز هاست بدون دخالت مدیر از وب سرویس استفاده کنید و برای بازیابی
using (System.Net.WebClient wc = new System.Net.WebClient())
{
using (System.IO.FileStream fs = new System.IO.FileStream("C:\\temp.png",System.IO.FileMode.Create))
{
Byte[] barray = wc.DownloadData("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png");
fs.Write(barray, 0, barray.Length);
picbox.Image = Image.FromStream(fs);
}
}

Felony
چهارشنبه 08 اردیبهشت 1395, 01:42 صبح
خب درست حالا فرض کنید کلاینت میخواد یه کارمند جدید ایجاد کنه و یه عکس براش انتخاب میکنه(از روی سیستم خودش).حالا این عکس رو چطوری روی سرور(توی یه پوشه) یا روی دیتابیس ذخیره کنیم؟
والا من نمیدونم سمت سرور و کلاینت چی دارید و معماری رو چطوری پیاده کردید ولی درستش این هست که یک وب سرویس (مثلا یک سرویس WCF) این وظایف رو برعهده بگیره و شما بافر عکس و کد پرسنلی رو بهش بدید و در سمت سرور وب سرویس عکس رو در محل مورد نظر ذخیره کنه .


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


منم موافقم ولی اپه میخواین این کار روکنید برای ذخیره عکس دز هاست بدون دخالت مدیر از وب سرویس استفاده کنید و برای بازیابی
using (System.Net.WebClient wc = new System.Net.WebClient())
{
using (System.IO.FileStream fs = new System.IO.FileStream("C:\\temp.png",System.IO.FileMode.Create))
{
Byte[] barray = wc.DownloadData("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png");
fs.Write(barray, 0, barray.Length);
picbox.Image = Image.FromStream(fs);
}
}
و مثل همیشه سناریوهای امن برنامه های ایرانی ...

mojtabamalaekeh
چهارشنبه 08 اردیبهشت 1395, 02:02 صبح
و مثل همیشه سناریوهای امن برنامه های ایرانی ...
سلام
یعنی نحوه دانلود و ذخیره ی یک عکس ـ به این شکل ـ ضعف امنیتی داره؟

Felony
چهارشنبه 08 اردیبهشت 1395, 02:55 صبح
اون روش به کل برای ذخیره عکس ضعف امنیتی نداره ولی وقتی تو این سناریو سازمانی برای دانلود تصویر از سرور استفاده بشه بله که داره.

- کاربر میتونه عکس های دیگه رو سرور رو دانلود بکنه .
- کاربر میتونه به وب سرویس مذکور حملات dos بزنه و سرور down کنه .
- و ...

در سناریو فوق راهکار امن این هست که به هر کابر در دیتابیس یک id یونیک (مثلا guid ) تخصیص داده بشه و عکس ها با اون نام guid در شناسایی بشن - برای دانلود عکس یک پرسنل باید guid اون رو بدونی و این مورد رو فقط برنامه میتونه ار بانک طالاعاتی بخونه .
بماند که پیاده سازی امن همین سناریو هم ریزه کاری های خودشو داره و در ضمن بهتره یک وب سرویس این کارو برعهده بگیره نه http server یا file server و ...

mojtabamalaekeh
چهارشنبه 08 اردیبهشت 1395, 05:18 صبح
بهتره یک وب سرویس این کارو برعهده بگیره نه http server یا file server و ...
چرا؟
اگه برا دانلودهامون guid رو post کنیم به http server چه مشکلی میتونه داشته باشه که وب سرویس نداره؟
چون تا حالا وب سرویس نساختم می پرسم.

hahaie
چهارشنبه 08 اردیبهشت 1395, 13:06 عصر
من که از جواب دوستان هیچ چیزی نفهمیدم. :ناراحت:
آقایون میدونید که اینجا تالار C# هست؟؟؟؟
آقا من یه نرم افزار windows form نوشتم که دیتابیسش روی سرور هست و نرم افزار روی کلاینتها نصب میشه خب؟
برای تمام عملیات ذخیره،حذف و ویرایش هم توی اسکیوال StoreProcedure نوشتم و توی برنامم اونها رو صدا میزنم.
حالا برای فرم ثبت کارمند میخوام یه فیلد عکس داشته باشم.چیکار باید بکنم؟؟

mojtabamalaekeh
چهارشنبه 08 اردیبهشت 1395, 14:33 عصر
یعنی سیستم عامل سرورتون «سیستم عامل غیر سرور» (ویندوز 7, 8/8.1, 10 و...) است؟

این تاپیک (http://barnamenevis.org/showthread.php?400645-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B9%DA%A9%D8%B3-%D8%AF%D8%B1-sql-server2008-%D8%A8%D8%A7-%D8%AE%D8%A7%D8%B5%DB%8C%D8%AA-FileStream)
و
پست 12 این تاپیک (http://barnamenevis.org/showthread.php?407106-%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-(%D8%A2%D8%AF%D8%B1%D8%B3-%D8%B9%DA%A9%D8%B3-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D9%85%DB%8C%D8%B4%D9%87-%D9%88-%D8%A7%D8%B2-%D8%B7%D8%B1%DB%8C%D9%82-%D8%A2%D8%AF%D8%B1%D8%B3-%D8%B9%DA%A9%D8%B3-%D8%B1%D8%A7-%D9%84%D9%88%D8%AF-%D9%85%DB%8C%DA%A9%D9%86%DB%8C%D9%85)&p=1812094&viewfull=1#post1812094)
و
استک اورفلو (http://stackoverflow.com/questions/5613898/storing-images-in-sql-server)

hahaie
یک شنبه 12 اردیبهشت 1395, 08:12 صبح
نه عزیز من سیستم عامل سرور از نسخه های سرور هست.

mojtabamalaekeh
یک شنبه 12 اردیبهشت 1395, 14:51 عصر
سلام
من اون لینک ها رو خوندم به نظرم خیلی خوب بودن و اگر از SQL Server 2008 یا بالاتر استفاده می کنید، ذخیره عکس توی جدول، کار پیاده سازی رو راحت می کنه.

اول نمونه برنامه ای که براتون ضمیمه کردم رو ببینید.
برنامه فقط عمل INSERT رو انجام میده. عمل UPDATE و DELETE رو هم بهتره با StoredProcedure بنویسید. عمل DELETE هم Transaction میخواد چون 2 جدول داریم.

بعد اگه دوست داشتین موارد مربوط به Performance رو هم بخونید:
- فایل های (عکسهای) زیر 256KB رو توی جدول و با فیلدی از نوع varbinary(max) ذخیره کنید.
- جدول عکسها رو جدا از جدول اطلاعات بذارید.
- جدول عکس ها رو به یک FILEGROUP جداگانه منتقل کنید (روی فایل گروه مستقل از PRIMARY ایجاد کنید).
- فایل هایی با حجم بالاتر از 1MB رو با FILESTREAM ذخیره کنید نه توی جدول.

hahaie
دوشنبه 13 اردیبهشت 1395, 01:09 صبح
ممنون دوست عزیز.
قبل از اینکه شما پست بالا رو بذارین من یه فیلد از نوع Varbinary توی جدول کارمندان ایجاد کردم و عملیات ذخیره رو انجام میدم.مشکلی نیست
اما توی فرم کاربران بنده یه گرید ویو دارم که اطلاعات جدول کارمندان رو نشون میده فیلد مربوط به عکس هم توی گرید بصورت مخفی آوردم حالا میخوام یه pictureBox داشته باشم که وقتی کاربر بین رکوردای گرید جابجا میشه عکس هم توی pictureBox نشون داده بشه.
کسی میتونه کمک کنه؟

mojtabamalaekeh
دوشنبه 13 اردیبهشت 1395, 04:34 صبح
خواهش می کنم.
توی رویداد RowEnter گرید ویو مقدار e.RowIndex رو استفاده کنید.

hahaie
دوشنبه 13 اردیبهشت 1395, 05:23 صبح
آقا من از دو کد استفاده کردم هر دوشم جواب نداد:


pictureBox1.Image = (Image)Dgv_Staffs.CurrentRow.Cells[23].Value;
این کد خطایی نمیده ولی عکس رو نشون نمیده(توی جدول دارای مقدار هستش البته از نوع varbinary)
و این کد:


var data = (Byte[])(Dgv_Staffs.CurrentRow.Cells[23].Value);
var stream = new System.IO.MemoryStream(data);
pictureBox1.Image = Image.FromStream(stream);


این کد هم خطای زیر رو میده:
ArgumentNullException was unhandled:Buffer cannot be null

mojtabamalaekeh
دوشنبه 13 اردیبهشت 1395, 08:30 صبح
روش اول باید خطا بده چون این تبدیل نوع درست نیست.
اما شما گفتین خطا نداده پس حتما مقدار اون سلول null هست چون من تبدیل null به Image رو تست کردم مشکلی نداشت.

روش دوم درسته و پیغام خطاش هم داره میگه که data مقدارش null هست.

برای اینکه از مقدار سلول گرید ویو مطمئن بشین BreakPoint بذارید روی خط اول (هر دو روش) و ماوس رو ببرید روی کلمه Value

یا مقداری توی دیتابیس نیست یا درست واکشی نشده.

hahaie
سه شنبه 14 اردیبهشت 1395, 00:58 صبح
آقا عذر میخوام روش دوم شماره ستونش اشتباه بود.درستش کردم ولی الان یه خطای جدید میده:
Unable to cast object of the 'system.Data.Linq.binary' to tyoe 'System.Byte[]'

چرا؟

mojtabamalaekeh
سه شنبه 14 اردیبهشت 1395, 03:11 صبح
مقداری که از نوع system.Data.Linq.binary هست رو با متد ToArray() به آرایه byte[] تبدیل کنید.
تا حالا با linq به SQL وصل نشدم ولی متن خطا رو که گوگل کردم جواب این بود.

hahaie
سه شنبه 14 اردیبهشت 1395, 05:19 صبح
آقا حل شد خیلی خیلی ممنون.


var data = (Byte[])(Dgv_Staffs.CurrentRow.Cells[23].Value as System.Data.Linq.Binary).Toarray();


کاش پستهامون یه تیک Solved داشت.(قابل توجه مدیران)