كيفية تحميل وتنزيل الملفات في ASP.NET Core MVC
السلام عليكم ورحمة الله وبركاته اليوم سنتعلم تصميم مواقع الكترونيه ورفع الصور والملفات تصفع مقالاتنا السابقه ل تعلم لغه البرمجه
في مشروع asp core فارغ ، قم بتحديث StartUp.cs لإضافة خدمات وبرامج وسيطة لـ MVC واضف بعض ال Services المهمه من اجل تعليم التطبيق ما يجب فعله عند رفع ملف كالتالي :
public void ConfigureServices(
IServiceCollection services)
{
services.AddSingleton<IFileProvider>(
new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")));
services.AddMvc();
}
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env)
{
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
أضف Controller وaction methods وكتابة الكود الخاص ب رفع الصور لتحميل وتنزيل الملف كالتالي :
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
if (file == null || file.Length == 0)
return Content("file not selected");
var path = Path.Combine(
Directory.GetCurrentDirectory(), "wwwroot",
file.GetFilename());
using (var stream = new FileStream(path, FileMode.Create))
{
await file.CopyToAsync(stream);
}
return RedirectToAction("Files");
}
public async Task<IActionResult> Download(string filename)
{
if (filename == null)
return Content("filename not present");
var path = Path.Combine(
Directory.GetCurrentDirectory(),
"wwwroot", filename);
var memory = new MemoryStream();
using (var stream = new FileStream(path, FileMode.Open))
{
await stream.CopyToAsync(memory);
}
memory.Position = 0;
return File(memory, GetContentType(path), Path.GetFileName(path));
}
إضافة صفحة Razor مع نموذج HTML لتحميل ملف مع مراعاة تسمية ال input نفس الاسم الذي تم كتابته داخل ال Action كالتالي :
<form asp-controller="Home" asp-action="UploadFile" method="post"
enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">Upload File</button>
</form>
المناقشه:
يوفر ربط طراز ASP.NET Core MVC واجهة IFormFile لتحميل ملف واحد أو أكثر. يجب أن يحتوي نموذج HTML على نوع الترميز المعين على multipart / form-data وهو نوع التشفير الذي يكتب داخل وسم Form وعنصر إدخال مع تعيين typeattribute على الملف.
يمكنك أيضًا تحميل ملفات متعددة عن طريق تلقي قائمة بـ IFormFile في طريقة العمل وتعيين عنصر الإدخال بسمة متعددة للتبسيط يمكنك ارسال اكثر من ملف في نفس الوقت ورفعهم وترسلهم ك List Of Files ويقوم ال Action الخاص ب رفع الملفات برفعهم واحدا تلو الاخر
// In Controller
[HttpPost]
public async Task<IActionResult> UploadFiles(List<IFormFile> files)
// In HTML
<input type="file" name="files" multiple />
يمكنك أيضًا الحصول على IFormFile كخاصية على النموذج الذي تم استلامه بواسطة طريقة الإجراء.
ملحوظة
يجب أن يتطابق الاسم الموجود في عناصر الإدخال مع اسم action الإجراء (أو اسم خاصية النموذج) حتى يعمل ربط النموذج. هذا لا يختلف عن نموذج الربط من أنواع بسيطة ومعقدة. حتي لو كان الرفع لمجموعه من الملفات دقعة واحده يجب ان يكون اسم ال Input هو نفس اسم المتغير الذي يدخل ال Action
التحميل :
تحتاج Action الإجراء إلى إرجاع FileResult إما stream, byte[] أو مسار افتراضي للملف. ستحتاج أيضًا إلى معرفة نوع محتوى الملف الذي يتم تنزيله. فيما يلي نموذج للأداة المساعدة (سريعة / متسخة). وهنا نرى كود برمجي من الصيغ المقترحه عمل Validation عليها
private string GetContentType(string path)
{
var types = GetMimeTypes();
var ext = Path.GetExtension(path).ToLowerInvariant();
return types[ext];
}
private Dictionary<string, string> GetMimeTypes()
{
return new Dictionary<string, string>
{
{".txt", "text/plain"},
{".pdf", "application/pdf"},
{".doc", "application/vnd.ms-word"},
{".docx", "application/vnd.ms-word"},
{".xls", "application/vnd.ms-excel"},
{".xlsx", "application/vnd.openxmlformats
officedocument.spreadsheetml.sheet"},
{".png", "image/png"},
{".jpg", "image/jpeg"},
{".jpeg", "image/jpeg"},
{".gif", "image/gif"},
{".csv", "text/csv"}
};
}
إرسال تعليق