ایپدا  مقالات آموزشی مقالات ASP.Net ذخیر و بازیابی تصاویر در دیتابیس با استفاده از Entity Framework
ذخیر و بازیابی تصاویر در دیتابیس با استفاده از Entity Framework

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

** از همین مقاله میتوانید برای ذخیره و بازیابی هر نوع فایلی در دیتابیس استفاده کنید.

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

اسکریپت ایجاد جدول:

Create Table UsersInfo
( 
	UserId int identity primary key,
	UserName Nvarchar(50) ,
	photo varbinary(max)
)


اما گام دوم ذخیره سازی عکس هستش.
ابتدا فرم رو میچینیم. برای اینکه اطلاعات کاربر رو توی دیتابیس ذخیره کنیم از یک Textbox برای نام کاربری و یک Fileupload برای آپلود تصاویر کاربران استفاده کردم.
Username :
<asp:TextBox ID='txtUsername' runat='server'></asp:TextBox>
Select Photo:<asp:FileUpload ID='fgupload' runat='server'/>
<asp:Button ID='btnCreateUser' runat='server' Text='Create user' OnClick='btnCreateUser_Click'/>


تو گام بعدی کافیه که یه ADO.Net Entity Data Model به سیستم اضافه کنید و مراحل ویزاردی رو تا آخر بروید.
پیشنهاد میکنم یه نگاهی به Entity که ساخته شده بندازید. می بینید که دیتاتایپ ستون تصویر byte[] است. (آریه ای از بایت.)
حالا به سراغ code behind میریم.  برای ذخیره سازی عکس تنها از این چند خط کد ساده و بدون دردسر استفاده میکنیم:

UsersInfo user = new UsersInfo();
user.photo = fgupload.FileBytes;
user.UserName = txtUsername.Text;	

db2Entities1 db = new db2Entities1();
db.AddToUsersInfoes(user)
db.SaveChanges();


خوب عکس ها با موفقیت توی دیتابیس ذخیره شد. حالا باید عکس ها رو بخونیم و به کاربر نشون بدیم.اینکار توی وب یه کوچولو دردسر داره.

مجدداً چینش فرم برای نمایش اطلاعات:
Username :
<asp:TextBox ID='TextBox1' runat='server'></asp:TextBox>
<asp:Image ID='imguserphoto' runat='server' ></asp:Image>
<asp:Button Text='ShowImage' runat='server' ID='btnShowImage' onclick='btnShowImage_Click'/>


 بهترین روش اینه که شما از یک http Handler استفاده کنید.
از منوی add new Item یه Generic handler انتخاب کنید و اون رو به پروژه اضافه کنید. من اسمش رو ShowImages انتخاب کردم. توجه داشته باشید که پسوند این فایل ashx هستش.

اینم کدی که برای http handler استفاده کردم:
public class ShowImages : IHttpHandler
{
	public void ProcessRequest(HttpContext context)
		{
			Int32 UserID;
			if (context.Request.QueryString['id'] != null)
				UserID = Convert.ToInt32(context.Request.QueryString['id']);
            Else
				throw new ArgumentException('No parameter specified');
			context.Response.ContentType = 'image/png';
			Stream strm = ShowUserImage(UserID);
			byte[] buffer = new byte[4096];
			int byteSeq = strm.Read(buffer, 0, 4096);

			while (byteSeq > 0)
			{
			context.Response.OutputStream.Write(buffer, 0, byteSeq);
			byteSeq = strm.Read(buffer, 0, 4096);
			}
			// context.Response.BinaryWrite(buffer);
		}
		public Stream ShowUserImage(int UserID)
		{
			List lst = new List();
			db2Entities1 db = new db2Entities1();
			UsersInfo u = db.UsersInfoes.Where(s =>s.UserId == UserID).FirstOrDefault();
			
			Try
			{
				return new MemoryStream(u.photo);
			}
			Catch
			{
				return null;
			}
		}
		public bool IsReusable
		{
			Get
			{
				return false;
			}
		}
}
و برای استفاده از این http handler توی Codebehind از این تیکه کد استفاده میکنم:
db2Entities1 db = new db2Entities1();
UsersInfo user = db.UsersInfoes.FirstOrDefault();
txtUsername.Text = user.UserName
imguserphoto.ImageUrl = '~/ShowImages.ashx?ID=' + user.UserId;


ضمیمه ها:
SaveImageToDB_EF_kavyani.zip
امیدوارم که این مقاله برای دوستان مفید واقع بشود.
با احترام
محسن کاویانی

ضمیمه ها :
SaveImageToDB_EF_kavyani.zip
Permissions_Poster_2014.pdf



آیا برایتان مفید بود ؟     

دریافت مقاله :

درباره نویسنده

محسن کاویانی
از سال 1383 به صورت تخصصی وارد دنیای برنامه نویسی شده است و بعد از سه سال تخصص خود را در حوزه SQL Server افزایش داده و موفق به اخذ مدرک MCSE از مایکروسافت شده است. وی در این سالها در سمت های مشاور، مدرس و مدیر دیتابیس (DBA) در شرکتها و نهادهای دولتی و خصوصی بزرگ و کوچک مشغول به کار بوده است. برای دریافت روزمه ایشان اینجا را کلیک نمایید

نظرات

محسن کاویانی1394/12/24

چند نوع دستور select وجود دارد...

پاسخ    

سلاله داجر1394/12/24

سه نوع دستور select وجود دارد.

حذف     ویرایش
سلاله داجر1394/12/12

با تشکر

حذف     ویرایش
الهام قدیمی1394/12/17

دو نوع دستور select وجود دارد.

حذف     ویرایش
الهام قدیمی1394/12/17

دو نوع دستور select وجود دارد.

حذف     ویرایش
سلاله داجر1394/12/17

نظر هیچ کدام از دوستان مورد قبول نمی باشد.

حذف     ویرایش
سلاله داجر1394/12/24

غلطه آی غلطههههههههههه.... نمیگم!!!

حذف     ویرایش
سلاله داجر1394/12/03

آیا می توان از تاریخ شمسی در Sql Server استفاده کرد ؟

پاسخ    

محسن کاویانی1394/12/11

با سلام
بله با استفاده از SQL CLR می توانید اینکار را به راحتی انجام دهید.

حذف     ویرایش
محسن کاویانی1394/12/12

fd

حذف     ویرایش
محسن کاویانی1394/12/12

fd

حذف     ویرایش
محسن کاویانی1394/11/11

سلام

jduweiouriuweruweiru

 

www.ipdaco.com

innocent

پاسخ    

محسن کاویانی1394/12/12

jjj

 

حذف     ویرایش
سلاله داجر1395/01/24

پاسخ    

سلاله داجر1395/01/24

پاسخ    

سلاله داجر1395/01/24

پاسخ    

سلاله داجر1395/01/24

پاسخ    

درباره IPDA

شرکت ایده پردازان دنیای داده که با نام تجاری ایپدا فعالیت می کند، شرکتی است نوپا اما با کوله باری از تجربیات و ایده های نوین اعضایی که هر کدام سابقه ی طولانی و موفق در زمینه ی فعالیت خود دارند


اطلاعات بیشتر