آموزش Asp.Net MVC آپلود فایل در سرور – یکی از وظایف مهم و اساسی هرسایتی قابلیت آپلود فایل است، حال چه از طرف مدیر سایت و چه از طرف کاربر. فرایند بارگزاری فایلها از سیستم کاربر به داخل فضای اپلیکیشن وب را آپلود فایل در سرور میگویند.
در قدم اول یک کنترلر میسازیم و به آن یک ویو اضافه میکنیم در ویو کنترلر خود فرم ارسال فایل را میسازیم. به نکات زیر در ساخت فرم توجه کنید
<form action="/Home/ShowData" method="post" enctype="multipart/form-data">
<input type="file" name="MyFile" />
<input type="submit" value="Upload File" />
</form>
فرم بالا توسط اتربیوت اکشن، داده های ما را به کنترلر Home و اکشن ShowData ارسال میکند. و در اکشن ShowData فایل ارسالی را دریافت میکنیم.
public ActionResult ShowData(HttpPostedFileBase MyFile)
{}
کدهای مربوط به آپلود فایل ممکن است در طول اجرای برنامه تولید خطا کند در اینصورت بهتر است از ساختار try catch استفاده شود. بدین صورت که کدهای مربوط به آپلود فایل را داخل بلوک try قرار میدهیم. و کدهایی که وقتی برنامه با خطا مواجه میشود را در بلوک catch قرار میدهیم.
try
{
//کد های آپلود فایل
}
catch (Exception ex)
{
ViewBag.Message = "ERROR:" + ex.Message.ToString();
return View();
}
در این گام برسی میکنیم که آیا اصلا فایلی برای آپلود کردن، ارسال شده یا خیر. این کار را توسط شرط زیر برسی میکنیم.
if (MyFile != null && MyFile.ContentLength > 0)
{
//کد های آپلود فایل
}
else
{
ViewBag.Message = "شما فایلی را برای آپلود مشخص نکرده اید.";
return View();
}
int FileMaxContentLength = 2;
string[] AccessFileFormat = { "jpg", "png" };
string FolderName = "/Upload/UserFile/";
string NewFileName = Guid.NewGuid().ToString();
int FileContentLength = (MyFile.ContentLength/1024)/1024;
string FileFormat = Path.GetExtension(MyFile.FileName).ToLower().Replace(".", "");
string FilePath= Server.MapPath(FolderName);
string FileAddress = Path.Combine(FilePath + NewFileName + "." + FileFormat);
برسی حجم فایلی که ارسال شده بسیار مهم است چون ممکن است کاربری فایلی چند گیگی در سایت ما آپلود کند و باعث شود تا حجم هاست ما پر شود و مشکلاتی برای ما ایجاد شود. برسی این کار توسط ۲ متغییر که در گام پنجم تعریف کردیم صورت میپذیرد یعنی FileContentLength که نشان دهنده حجم فایل است و FileMaxContentLength که نشان دهنده حجم مجاز برای آپلود است.
if (FileContentLength < FileMaxContentLength)
{
//کد های آپلود فایل
}
else
{
ViewBag.Message = "حجم فایل آپلود شده مجاز نیست. ";
return View();
}
آیا فرمت فایلی که ارسالی مجاز است؟ چون ممکن است هکر ها فایل های مخربی را در سایت ما آپلود کنند و باعث آسیب به سایت ما شود.
برسی این کار توسط ۲ متغییر که در گام پنجم تعریف کردیم صورت میپذیرد. یعنی FileFormat فرمت فایل آپلودی و AccessFileFormat لیستی از فرمت های مجاز است. و آیا فرمت فایل آپلود شده در لیست فرمت های مجاز وجود دارد یا خیر.
if (AccessFileFormat.Contains(FileFormat))
{
//کد های آپلود فایل
}
else
{
ViewBag.Message = "فرمت فایل مجاز نیست. ";
return View();
}
ساده ترین گام ذخیره فایل در سرور میباشد. دستور SaveAs و متغییر FileAddress در گام پنجم این کار انجام میشود.
MyFile.SaveAs(FileAddress);
ViewBag.Message = "فایل شما با موفقیت ارسال شد";
return View();
توسط قطعه کد زیر پیام موفقیت و یا ارور آپلود فایل را در ویو اکشن مقصد نمایش میدهیم
<h1>Show Upload Message</h1>
@ViewBag.Message
ارور هایی ممکن است با آن مواجه شوید، آنها را رفع کنید.
برای رفع این ارور به فایل web.config مراجعه کرده و کد زیر را داخل تگ configuration اضافه کنید.
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
</system.webServer>
برای رفع این ارور به فایل web.config مراجعه کرده و به تگ httpRuntime اتربیوت maxRequestLength=”1048576″ را اضافه کنید.
<system.web>
<compilation debug="true" targetFramework="4.7.2"/>
<httpRuntime targetFramework="4.7.2" maxRequestLength="1048576"/>
</system.web>
public ActionResult ShowData(HttpPostedFileBase MyFile)
{
try
{
if (MyFile != null && MyFile.ContentLength > 0)
{
int FileMaxContentLength = 2; //mg
string[] AccessFileFormat = { "jpg", "png" };
string FolderName = "/Upload/UserFile/";
string NewFileName = Guid.NewGuid().ToString();
int FileContentLength = (MyFile.ContentLength / 1024) / 1024;
string FileFormat = Path.GetExtension(MyFile.FileName).ToLower().Replace(".", "");
string FilePath = Server.MapPath(FolderName);
string FileAddress = Path.Combine(FilePath + NewFileName + "." + FileFormat);
if (FileContentLength < FileMaxContentLength)
{
if (AccessFileFormat.Contains(FileFormat))
{
MyFile.SaveAs(FileAddress);
ViewBag.Message = "فایل شما با موفقیت ارسال شد";
return View();
}
else
{
ViewBag.Message = "فرمت فایل مجاز نیست. ";
return View();
}
}
else
{
ViewBag.Message = "حجم فایل آپلود شده مجاز نیست. ";
return View();
}
}
else
{
ViewBag.Message = "شما فایلی را برای آپلود مشخص نکرده اید.";
return View();
}
}
catch (Exception ex)
{
ViewBag.Message = "ERROR:" + ex.Message.ToString();
return View();
}
}