File Upload در ASP.NET 5 و MVC 6

شرکت مایکروسافت در ASP.NET 5 و MVC 6 ویژگی های File Upload را تغییر داده است. این ویژگی ها در این مقاله بررسی خواهد شد.

File Upload در ASP.NET 5 و MVC 6

حالا MVC 6 از پر کردن مدل (model binding) از چند فرم (Multipart form data) پشتیبانی می کند. شما می توانید فایلها را به عنوان یک پروپرتی از مدل به حساب آورید.

در زیر کدهای View که به شما در Upload فایل کمک می کند مشاهده می نمایید.

@using (Html.BeginForm("Upload", "Home", 
    FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <table>
        <tr>
            <td>Name</td>
            <td>@Html.EditorFor(model => model.Name)</td>
        </tr>
        <tr>
            <td>Address</td>
            <td>@Html.EditorFor(model => model.Address)</td>
        </tr>
        <tr>
            <td>Age</td>
            <td>@Html.EditorFor(model => model.Age)</td>
        </tr>
        <tr>
            <td>File</td>
            <td>@Html.TextBoxFor(m => m.File, new { type = "file" })</td>
        </tr>
        <tr>
            <td colspan="2">
                 <input type="submit" value="Save" />
            </td>
        </tr>
    </table>
}

در زیر کلاس مدل به همراه پروپرتی فایل که از نوع IFormFile از فضای نام Microsoft.AspNet.Http می باشد را مشاهده می نمایید.
 

using System.ComponentModel.DataAnnotations;
using Microsoft.AspNet.Http;
 
namespace HelloMvc.Models
{
    public class User
    {
        [Required]
        [MinLength(4)]
        public string Name { get; set; }
        public string Address { get; set; }
        public int Age { get; set; }
        [Required]
        [FileExtensions(Extensions = "jpg,jpeg")]
        public IFormFile File { get; set; }
 
    }    
}

در کنترلر Home یک متد Upload با پارامتر User ساخته شده است. این متد به ذخیره داده و آپلود فایل در فایل های سیستمی کمک می نماید.

using Microsoft.AspNet.Mvc;
using HelloMvc.Models;
using Microsoft.AspNet.Hosting;
using System.IO;
using Microsoft.Net.Http.Headers;
using Microsoft.AspNet.Http;
 
namespace HelloMvc.Controllers
{
    public class HomeController : Controller
    {
        private readonly IHostingEnvironment _hostingEnvironment;
        public HomeController(IHostingEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }
        public IActionResult Upload(User user)
        {
            if (ModelState.IsValid)
            {
                var file = user.File;
                var parsedContentDisposition =
                    ContentDispositionHeaderValue.Parse(file.ContentDisposition);
                var filename = Path.Combine(_hostingEnvironment.WebRootPath,
                    "Uploads", parsedContentDisposition.FileName.Trim('"'));
                file.SaveAsAsync(filename);
            }
 
            return View("Index");
        }
 
        public IActionResult Index()
        {
            return View(new User());
        }
    }
}

شما نیاز به trim کردن (کوچک کردن حروف) نام فایل دارید وگرنه ASP.NET خطای argumentException تولید می نماید چراکه نام فایل با دو رشته گرفته می شود (یکی نام و دیگری فرمت آن فایل مانند filename.txt) که این یک کاراکتر معتبر برای پروپرتی fileName نمی باشد. با تزریق IHostingEnvironment به کنترلر می توان محل wwwroot (ریشه پروژه) را شناسایی کرد. برای آپلود چند فایل می توان همین عملیات را با

 List<IFormFile>

انجام داد.