2016-01-26 123 views
1

我試圖做我的第一個簡單的文件上傳在MVC 5.我下了一堆我發現的例子,但由於某種原因,在我的「創建」的ActionResult的uploadFile總是進來爲NULL,因此上傳代碼從不運行。任何人看到我可能做錯了什麼?簡單的文件上傳返回NULL?

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 


<h2>Documents.</h2> 
<h4>Upload a new document.</h4> 

<div class="well"> 
@using (Html.BeginForm("Create", "Documents", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <h3>Select a file to upload. </h3> 

    <input type="file" name="files" value="" multiple="multiple" /> 

    <input type="submit" value="Upload your file" title="Upload" /> 

    <div style="color:Red;font-size:14px">@ViewBag.Message</div> 
} 
</div> 

這裏是我的控制器:

// POST: Documents/Create 
     [HttpPost] 
     public ActionResult Create(HttpPostedFileBase uploadFile) 
     { 
      try 
      { 
       if(uploadFile != null && uploadFile.ContentLength > 0) 
       { 

        string filePath = Server.MapPath("../SiteDocuments" + uploadFile.FileName); 

        uploadFile.SaveAs(filePath); 
       } 

       return RedirectToAction("Index"); 
      } 
      catch (Exception ex) 
      { 
       return View(); 
      } 

     } 

回答

2

你的文件輸入元素的名稱應與你的操作方法參數的名稱。

所以更新您的HTML標記具有相同的name屬性值。

<input type="file" name="uploadFile" value="" multiple="multiple" /> 

和動作方法將

[HttpPost] 
public ActionResult Create(HttpPostedFileBase uploadFile) 
{ 
    // do something 
} 

或者改變你的操作方法參數的名稱,以配合您的文件輸入元素名稱。

<input type="file" name="files" value="" multiple="multiple" /> 

和動作方法將

[HttpPost] 
public ActionResult Create(HttpPostedFileBase files) 
{ 
    if(files!= null && files.ContentLength > 0) 
    { 
     // do something 
    } 
} 

當您添加multiple="multiple"屬性添加到輸入要素,瀏覽器將允許最終用戶一次選擇多個文件。在這種情況下,如果你的動作方法的參數是HttpPostedFileBase對象的單個實例,它會從選定n文件收到的第一個文件。如果你想要所有的文件,你可以將你的參數更改爲一個集合,如

[HttpPost] 
public ActionResult Create(IEnumerable<HttpPostedFileBase> files) 
{ 
    if (files != null && files.Any()) 
    { 
     foreach (var file in files) 
     { 
      if (file.ContentLength > 0) 
      { 
       //do something 
      } 
     } 
    } 
} 
+1

謝謝,就是這樣。一旦我獲得了匹配的元素名稱以及它在其中工作的.MapPath中缺少的斜槓, – Caverman

+0

@Caverman:歡迎您! IMHO,嘗試使用'Path.Combine'而不是手動串聯,如圖此[柱](http://stackoverflow.com/a/26111460/40521) – Shyju

+0

我最初有來自一個例子,我發現但我去回到簡單的使用Server.Mappath,看看是否能作任何形式的差異,這當然沒有。我會回到Path.Combine。 – Caverman