جهت آپلود یک یا چندین فایل در Asp.net Core MVC از اینترفیس IFromFile استفاده میکنیم.
ابتدا یک پروژه از نوع ASP.NET Core Web Application (.NET Core) و بصورت Empty ایجاد کنید و یک نام دلخواه برای آن انتخاب نمایید.
کلاس Startup را بصورت زیر ویرایش نمایید.
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?}");
});
}
ایجاد کنترلر و اکشن
یک پوشه به نام Controllers به بر نامه اضافه نمایید و درون آن یک کنترلر به نام Home قرار دهید و سپس اکشن UploadFile را جهت آپلود فایل به کنترلر اضافه نمایید.
[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");
}
یک سازنده برای کنترلر Home و یک اکشن به نام Index بصورت زیر به برنامه اضافه نمایید.
private readonly IFileProvider fileProvider;
public HomeController(IFileProvider fileProvider)
{
this.fileProvider = fileProvider;
}
public ActionResult Index()
{
return View();
}
ایجاد ویو
جهت ایجاد ویو ایتدا یک پوشه به نام Views ایجاد کنید و درون آن یک پوشه به نام Home اضافه نمایید.
در پایان یک ویو به نام Index بصورت زیر به آن اضافه نمایید.
<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>
ویوی دیگری به نام Files جهت نمایش فایلهای دانلود شده و دانلود فایلها بصورت زیر به برنامه اضافه نمایید.
@model UploadDownloadSample.Models.FilesViewModel
<p>List of Files</p>
<ul>
@foreach (var item in Model.Files)
{
<li>
<a asp-action="Download"
asp-route-filename="@item.Name">
@item.Name
</a>
</li>
}
</ul>
همانطور که مشاهده می کنید در ویوی فوق از یک view model به نام FilesViewModel استفاده شده است لذا جهت ایجاد کلاس فوق یک پوشه به نام Models به برنامه اضافه کنید و کلاسی به نام FilesViewModel را درون آن ایجاد کنید.
namespace UploadDownloadSample.Models
{
public class FileDetails
{
public string Name { get; set; }
public string Path { get; set; }
}
public class FilesViewModel
{
public List<FileDetails> Files { get; set; }
= new List<FileDetails>();
}
}
در ویو Files جهت دانلود هر یک از فایلها از اکشن Download استفاده شده است . لذا اکشن مورد نظر را بصورت زیر درون کنترلر Home درج می کنیم.
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();
System.Threading.Thread.Sleep(3000);
using (var stream = new FileStream(path, FileMode.Open))
{
await stream.CopyToAsync(memory);
}
memory.Position = 0;
return File(memory, GetContentType(path), Path.GetFileName(path));
}
با توجه به اکشن فوق جهت دانلود فایل به ContentType آن نیاز دازیم لذا برای انجام این مورد دو تابع زیر را به برنامه اضافه می کنیم.
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"}
};
}
البته شما با توجه به نیاز خود MIME های مورد نیاز خود را اضافه نمایید.