به فرایند بارگزاری فایلها از سیستم کاربر به داخل فضای اپلیکیشن وب، آپلود فایل گفته میشود. action های ASP.NET Core MVC با استفاده از یک تکنیک ساده model binding، از آپلود یک یا بیشتر از یک فایل پشتیبانی میکند.
در این مقاله، میخواهیم نگاهی بیندازیم به اینکه چطور میتوانیم همچین قابلیتی را در برنامه ASP.NET Core MVC داشته باشیم.
اگر برخی از مقالات قبلی این آموزشی سریالی را ندیده اید، توصیه می کنیم صفحه مربوط به این سری آموزشی را مشاهده کنید: آموزش سریالی ASP.NET Core MVC.
برای دانلود سورس کد این مقاله، روی این لینک کلیک کنید: آپلود فایل در ASP.NET Core MVC.
حالا بریم تا کارمان را شروع کنیم.
ایجاد یک کنترل File Input
برای آپلود فایلها، یک اپلیکیشن جدید ASP.NET Core MVC ایجاد میکنیم و یک کنترلر به نام FileUploadController میسازیم و یک HTML از کنترل file input برای اکشن Index طراحی میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<form method="post" enctype="multipart/form-data" asp-controller="FileUpload" asp-action="Index"> <div class="form-group"> <div class="col-md-10"> <p>Upload one or more files using this form:</p> <input type="file" name="files" multiple /> </div> </div> <div class="form-group"> <div class="col-md-10"> <input type="submit" value="Upload" /> </div> </div> </form> |
جهت پشتیبانی از آپلود فایلها، باید enctype را با multipart/form-data مشخص کنیم. ویژگی enctype
، تعیین میکند که چطور داده های فرم زمانی که به سرور ارسال میشوند باید رمزگذاری شوند. ویژگی enctype
فقط زمانیکه method فرم از نوع POST است، میتواند مورد استفاده قرار گیرد.
عنصر file input از آپلود چند فایل پشتیبانی میکند. با حذف ویژگی multiple
در این عنصر، میتوانیم آن را محدود به انتخاب فقط یک فایل کنیم.
نقش Model Binding
ما میتوانیم با استفاده ازاینترفیس IFormFile
از طریق Model Binding، به فایلهای آپلود شده به application دسترسی داشته باشیم. Model Binding در ASP.NET Core MVC، داده ها را از درخواستهای HTTP به پارامترهای action method مپ میکند. IFormFile
ارائه دهنده فایلی است که با HttpRequest
فرستاده میشود و دارای ساختار زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 |
public interface IFormFile { string ContentType { get; } string ContentDisposition { get; } IHeaderDictionary Headers { get; } long Length { get; } string Name { get; } string FileName { get; } Stream OpenReadStream(); void CopyTo(Stream target); Task CopyToAsync(Stream target, CancellationToken cancellationToken = null); } |
به عنوان یک تدبیر امنیتی، هرگز نباید بدون اعتبارسنجی به ویژگی FileName اعتماد کنیم.
هنگام آپلود فایل ها با استفاده از model binding و اینترفیس IFormFile، اکشن متد می تواند یک IFormFile واحد یا یک IEnumerable<IFormFile>
را که چندین فایل را ارائه می دهد را بپذیرد. ما می توانیم بر روی فایلهای آپلود شده حلقه بزنیم، آنها را در سیستم فایل محلی ذخیره کنیم و سپس از فایل ها مطابق با منطق برنامه خود استفاده کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class FileUploadController : Controller { ... [HttpPost("FileUpload")] public async Task<IActionResult> Index(List<IFormFile> files) { long size = files.Sum(f => f.Length); var filePaths = new List<string>(); foreach (var formFile in files) { if (formFile.Length > 0) { // full path to file in temp location var filePath = Path.GetTempFileName(); //we are using Temp file name just for the example. Add your own file path. filePaths.Add(filePath); using (var stream = new FileStream(filePath, FileMode.Create)) { await formFile.CopyToAsync(stream); } } } // process uploaded files // Don't rely on or trust the FileName property without validation. return Ok(new { count = files.Count, size, filePaths }); } } |
یک breakpoint در متد ()Index قرار دهیم و برنامه را اجرا کنیم:
زمانیکه فایلها را انتخاب میکنیم و بر روی Upload کلیک میکنیم، میتوانیم کد را debug کرده و ببینیم چطور فایلها در سیستم فایل سرور آپلود میشوند.
اینجا ما فقط تعداد و اندازه فایلهای آپلود شده را به همراه مسیر فایلها برمیگردانیم.
فایل های آپلود شده با استفاده از تکنیک IFormFile، قبل از پردازش، در حافظه یا دیسک روی سرور وب بافر می شوند. داخل action method، محتویات IFormFile به صورت یک stream قابل دسترسی هستند. علاوه بر سیستم فایل محلی، فایل ها را می توان به محل ذخیره سازی Azure Blob یا Entity Framework استریم کرد.
خوب، آپلود فایل تمام شد، بیایید آنچه را که یاد گرفتیم را خلاصه کنیم.
نتیجه گیری
در این مقاله، عناوین زیر را یاد گرفتیم:
- ایجاد یک کنترل file upload در برنامه ASP.NET Core MVC
- به کار گیری model binding برای گرفتن فایلهای آپلود شده
- خواندن و کپی کردن فایلها به stream
در قسمت بعدی این سری از آموزش، ما تزریق وابستگی در ASP.NET Core MVC را یاد خواهیم گرفت.