Borna66
02-21-2010, 09:15 PM
این مطلب کوتاه آموزشی با نحوه آپلود تصاویر در یک وب سایت مبتنی بر ASP.NET آشنا خواهید شد. در اینجا ما یک برنامه کوچک به زبان سی شارپ می نویسیم که کاربر را قادر می سازد که یک فایل تصویری با پسوند JPG را انتخاب و آپلود کند. در این آموزش فرض بر این است که شما با سی شارپ و مباحث پایه ای دات نت آشنا هستید.
برای این کار ابتدا یک کنترل FileUpload را از Toolbox (موجود در قسمت Standard) به صفحه خود اضافه کنید. یا اینکه کد زیر را در محلی که می خواهید کنترل آپلود فایل نمایش داده شود، قرار دهید.
<asp:FileUpload ID="PicUpload" runat="server" />
قبل از هر چیز فضای نام System.IO را using کنید. حالا کدهای زیر را در روالی که می خواهید عمل آپلود فایل در آن انجام شود قرار دهید. به طور مثال اگر می خواهید وقتی روی دکمه Upload کلیک شد، تصویر کاربر بر روی سرور آپلود شود، این کدها را درون روال Upload_Click قرار دهید.
if (PicUpload.PostedFile != null)
{
HttpPostedFile Pic = PicUpload.PostedFile;
if (Pic.ContentLength == 0)
{
Response.Write("فایل شما هیچ محتوایی ندارد!");
return;
}
if (Path.GetExtension(Pic.FileName).ToLower() != “.jpg”)
{
Response.Write(“پسوند این فایل نامعتبر است.”);
return;
}
byte[] data = new Byte[Pic.ContentLength];
Pic.InputStream.Read(data, 0, Pic.ContentLength);
string SavePath = @”images/”;
FileStream newPic = new FileStream(Server.MapPath(SavePath + Pic.FileName), FileMode.Create);
newPic.Write(data, 0, Pic.ContentLength);
newPic.Close();
}
این کد چطور کار می کند؟
در خط اول ابتدا چک می کنیم که آیا کاربر فایلی را برای آپلود انتخاب کرده است یا خیر. یعنی خاصیت PostedFile اگر برابر null بود به این معنی است که کاربر هیچ فایلی را برای آپلود انتخاب نکرده است پس کدهای زیر آن نباید اجرا شوند. سپس متغیری به نام Pic از نوع HttpPostedFile می سازیم تا بتوانیم اطلاعاتی در مورد فایل انتخابی کاربر بدست آوریم. بعد از آن با یک شرط چک می کنیم که حجم فایل انتخابی کاربر برابر با صفر نباشد. در if بعدی هم چک می کنیم که اگر پسوند فایل برابر jpg نبود یک پیغام خطای مناسب به کاربر نشان بده. بدیهی است که در اینجا می توانید پسوندهای دیگری مثل pdf را چک کنید.
دو خط زیر هم اطلاعات فایل انتخابی توسط کاربر را می خوانند :
byte[] data = new Byte[Pic.ContentLength];
Pic.InputStream.Read(data, 0, Pic.ContentLength);
و خط های زیر نیز عمل ساختن فایل جدید از روی فایل کاربر بر روی سرور (عمل آپلود) را انجام می دهند :
FileStream newPic = new FileStream(Server.MapPath(SavePath + Pic.FileName), FileMode.Create);
newPic.Write(data, 0, Pic.ContentLength);
آپلود تصاویر در یک دیتابیس SQL Server
اگر بخواهید به جای آپلود فایل کاربر روی یک فایل فیزیکی موجود در سرور آن را در یک دیتابیس SQL Server آپلود کنید، می توانید از قطعه کد زیر به جای دو خط بالا استفاده کنید. ابتدا فضاهای نام System.Data و System.Data.SqlClient را using کنید و سپس کد زیر را در جای مناسب قرار دهید.
object objImage = data;
SqlConnection connection = new SqlConnection(connectionString);
string sql_insert = "INSERT INTO tblImage (picture) values (@img)";
SqlCommand command = new SqlCommand(sql_insert, connection);
SqlParameter parameter = new SqlParameter("@img", SqlDbType.Image);
parameter.Value = objImage;
command.Parameters.Add(parameter);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
در کد بالا رشته اتصال دیتابیس خود را به جای connectionString قرار دهید و نام جدول و فیلدهای خود را در متغیر sql_insert بنویسید.
برای این کار ابتدا یک کنترل FileUpload را از Toolbox (موجود در قسمت Standard) به صفحه خود اضافه کنید. یا اینکه کد زیر را در محلی که می خواهید کنترل آپلود فایل نمایش داده شود، قرار دهید.
<asp:FileUpload ID="PicUpload" runat="server" />
قبل از هر چیز فضای نام System.IO را using کنید. حالا کدهای زیر را در روالی که می خواهید عمل آپلود فایل در آن انجام شود قرار دهید. به طور مثال اگر می خواهید وقتی روی دکمه Upload کلیک شد، تصویر کاربر بر روی سرور آپلود شود، این کدها را درون روال Upload_Click قرار دهید.
if (PicUpload.PostedFile != null)
{
HttpPostedFile Pic = PicUpload.PostedFile;
if (Pic.ContentLength == 0)
{
Response.Write("فایل شما هیچ محتوایی ندارد!");
return;
}
if (Path.GetExtension(Pic.FileName).ToLower() != “.jpg”)
{
Response.Write(“پسوند این فایل نامعتبر است.”);
return;
}
byte[] data = new Byte[Pic.ContentLength];
Pic.InputStream.Read(data, 0, Pic.ContentLength);
string SavePath = @”images/”;
FileStream newPic = new FileStream(Server.MapPath(SavePath + Pic.FileName), FileMode.Create);
newPic.Write(data, 0, Pic.ContentLength);
newPic.Close();
}
این کد چطور کار می کند؟
در خط اول ابتدا چک می کنیم که آیا کاربر فایلی را برای آپلود انتخاب کرده است یا خیر. یعنی خاصیت PostedFile اگر برابر null بود به این معنی است که کاربر هیچ فایلی را برای آپلود انتخاب نکرده است پس کدهای زیر آن نباید اجرا شوند. سپس متغیری به نام Pic از نوع HttpPostedFile می سازیم تا بتوانیم اطلاعاتی در مورد فایل انتخابی کاربر بدست آوریم. بعد از آن با یک شرط چک می کنیم که حجم فایل انتخابی کاربر برابر با صفر نباشد. در if بعدی هم چک می کنیم که اگر پسوند فایل برابر jpg نبود یک پیغام خطای مناسب به کاربر نشان بده. بدیهی است که در اینجا می توانید پسوندهای دیگری مثل pdf را چک کنید.
دو خط زیر هم اطلاعات فایل انتخابی توسط کاربر را می خوانند :
byte[] data = new Byte[Pic.ContentLength];
Pic.InputStream.Read(data, 0, Pic.ContentLength);
و خط های زیر نیز عمل ساختن فایل جدید از روی فایل کاربر بر روی سرور (عمل آپلود) را انجام می دهند :
FileStream newPic = new FileStream(Server.MapPath(SavePath + Pic.FileName), FileMode.Create);
newPic.Write(data, 0, Pic.ContentLength);
آپلود تصاویر در یک دیتابیس SQL Server
اگر بخواهید به جای آپلود فایل کاربر روی یک فایل فیزیکی موجود در سرور آن را در یک دیتابیس SQL Server آپلود کنید، می توانید از قطعه کد زیر به جای دو خط بالا استفاده کنید. ابتدا فضاهای نام System.Data و System.Data.SqlClient را using کنید و سپس کد زیر را در جای مناسب قرار دهید.
object objImage = data;
SqlConnection connection = new SqlConnection(connectionString);
string sql_insert = "INSERT INTO tblImage (picture) values (@img)";
SqlCommand command = new SqlCommand(sql_insert, connection);
SqlParameter parameter = new SqlParameter("@img", SqlDbType.Image);
parameter.Value = objImage;
command.Parameters.Add(parameter);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
در کد بالا رشته اتصال دیتابیس خود را به جای connectionString قرار دهید و نام جدول و فیلدهای خود را در متغیر sql_insert بنویسید.