با سلام
برای افراد زیادی این سوال همیشه مطرح هستش که چطور میتوانیم عکس ها رو در دیتابیس ذخیره و بازیابی کنیم. به همین دلیل تصمیم گرفتم که یه مقاله مختصری در این مورد تهیه کنم و در اختیار همه بزرگوارن قرار بدهم.
** از همین مقاله میتوانید برای ذخیره و بازیابی هر نوع فایلی در دیتابیس استفاده کنید.
گام اول ایجاد جدول:
نکته مهم اینجا این هستش که دیتاتایپ ستونی رو که برای ذخیره عکس درنظر گرفتید از نوع 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
امیدوارم که این مقاله برای دوستان مفید واقع بشود.
با احترام
محسن کاویانی