ASP.NET 5探險(2):上傳文件

(此文章同時發表在本人微信公衆號「dotNET每日精華文章」,歡迎右邊二維碼來關注。)css

題記:在ASP.NET 5(MVC 6)中處理上傳文件的方式和以前有所不一樣。html

在MVC 5以前的版本中上傳文件,有兩種方式。微信

1,直接對Request.Files進行訪問獲取HttpPostedFileBase,以下面代碼所示:spa

[HttpPost]
public ActionResult Upload()
{
    string path = @"D:\Temp\";
 
    HttpPostedFileBase photo = Request.Files["photo"];
 
    if(photo != null)
        photo.SaveAs(path + photo.FileName);
 
    return RedirectToAction("Index");
}

2,經過模型綁定獲取HttpPostedFileBase,以下面代碼所示:設計

[HttpPost]
public ActionResult Upload(HttpPostedFileBase photo)
{
    string path = @"D:\Temp\";
     
    if(photo != null)
        photo.SaveAs(path + photo.FileName);
 
    return RedirectToAction("Index");
}

更多詳細的用法能夠參考CodeProject的這篇文章《Uploading and returning files in ASP.NET MVC》。code

在MVC 6中一樣也是有兩種方式,只是提供的類和以前有所不一樣,沒有HttpPostedFileBase,取而代之的是IFormFile,且額外的一些文件信息放到了ContentDispositionHeaderValue。orm

1,直接使用Request.Form.Files訪問IFormFile,以下代碼所示:htm

[HttpPost]
public ActionResult Upload()
{
    string path = @"D:\Temp\";

    IFormFile photo = Request.Form.Files["photo"];

    if (photo != null)
    {
        var parsedContentDisposition = ContentDispositionHeaderValue.Parse(photo.ContentDisposition);
        var originalName = parsedContentDisposition.FileName.Replace("\"", "");
        photo.SaveAs(path + originalName);
    }

    return RedirectToAction("Index");
}

你們能夠注意到了,我對parsedContentDisposition.FileName進行了一個替換處理。這是由於FileName這個屬性值會帶有先後雙引號。我不知道這個是個bug仍是故意設計,過一會去提個Issue問問。rem

2,經過模型綁定獲取IFormFile,以下面代碼所示:rpc

[HttpPost]
public ActionResult Upload(IFormFile photo)
{
    string path = @"D:\Temp\";

    if (photo != null)
    {
        var parsedContentDisposition = ContentDispositionHeaderValue.Parse(photo.ContentDisposition);
        var originalName = parsedContentDisposition.FileName.Replace("\"", "");
        photo.SaveAs(path + originalName);
    }

    return RedirectToAction("Index");
}

另外,還須要注意的是,在MVC 6中已經沒法用Server.MapPath這樣的方法來獲得虛擬地址對應的物理地址了,只能經過IHostingEnvironment.MapPath來獲取(此方法是一個擴展方法)。而要使用IHostingEnvironment的實例,必須把其注入到Controller中(IHostingEnvironment是默認被系統註冊的,無需也沒法顯式註冊)。通過個人試驗,只能經過構造器注入,而沒法經過[Activate]來屬性注入。

相關文章
相關標籤/搜索