在Asp.net的WEBform中,上傳文件與下載文件處理是很簡單的事情,如果轉為ASP.NET MVC呢?那就沒有那麼容易了,難少少,也不是很難,一起來看下本文吧。本文主要講如何在Asp.net MVC中上傳文件,然後如何再從伺服器中把上傳過的文件下載下來.在Web Forms中,當你把一個Fil ...
在Asp.net的WEBform中,上傳文件與下載文件處理是很簡單的事情,如果轉為ASP.NET MVC呢?那就沒有那麼容易了,難少少,也不是很難,一起來看下本文吧。本文主要講如何在Asp.net MVC中上傳文件,然後如何再從伺服器中把上傳過的文件下載下來.
在Web Forms中,當你把一個FileUpload控制項拖到設計器中,你或許沒有註意到在生成的HTML中會在form標簽中加入一條額外屬性enctype="multipart/form-data". 而FileUpload控制項本身會生成為<input type=”file” />,在MVC的view里,有許多種方法可以做到同樣效果,第一種的HTML如下:
<form action="/" method="post" enctype="multipart/form-data">
<input type="file" name="FileUpload1" /><br />
<input type="submit" name="Submit" id="Submit" value="Upload" />
</form>
註意form標簽已經包括了enctype標簽,而method屬性則設為”post”,這樣設置並不多於因為預設的提交時通過HTTP get方式進行的。下麵這種方式,使用Html.BeginForm()擴展方法,會生成和上面同樣的HTML:
<%
using (Html.BeginForm("", "home", FormMethod.Post, new {enctype="multipart/form-data"}))
{%>
<input type="file" name="FileUpload1" /><br />
<input type="submit" name="Submit" id="Submit" value="Upload" />
<% }%>
OK,現在我們可以瀏覽本地文件然後通過Upload提交按鈕將文件提交到伺服器端,下一步就是在伺服器端處理上傳的文件,在使用fileUpload控制項時,你可以很輕鬆的通過FileUpload的hasFile方法來查看文件是否被上傳。但是在Asp.net MVC中貌似就不是這麼方便了,你會和原始的HTTP更接近一些,然而,一個擴展方法可以處理這些:
public static bool HasFile(this HttpPostedFileBase file)
{
return (file != null && file.ContentLength > 0) ? true : false;
}
當你看到對應的Controller類的代碼時,你會發現Request對象作為HttpRequestBase類型的一個屬性存在。HttpReuqestBase其實是HTTP請求的一個封裝,暴漏了很多屬性,包括Files collection(其實是HttpFileCollectionBase的集合),在集合中的每一個元素都是HttpPostedFileBase的集合,擴展方法是用於確保上傳的文件是否存在。實際上,這和FileUpload.HasFile()方法的工作原理一致。在Controller Action中使用起來其實很容易:
public class HomeController : Controller
{
public ActionResult Index()
{
foreach (string upload in Request.Files)
{
if (!Request.Files[upload].HasFile()) continue;
string path = AppDomain.CurrentDomain.BaseDirectory "uploads/";
string filename = Path.GetFileName(Request.Files[upload].FileName);
Request.Files[upload].SaveAs(Path.Combine(path, filename));
}
return View();
}
}
或許你已經比我更早的想到如何更好的將Request.Files作為一個集合使用。這意味著它不僅僅只能容納一個文件,而能容納多個,我們將上面的View改為如下:
<%
using (Html.BeginForm("", "home", FormMethod.Post, new {enctype="multipart/form-data"}))
{%>
<input type="file" name="FileUpload1" /><br />
<input type="file" name="FileUpload2" /><br />
<input type="file" name="FileUpload3" /><br />
<input type="file" name="FileUpload4" /><br />
<input type="file" name="FileUpload5" /><br />
<input type="submit" name="Submit" id="Submit" value="Upload" />
<% }%>