利用Asp.net MVC處理檔案的上傳下載

來源:互聯網
上載者:User

如果你僅僅只有Asp.net Web Forms背景轉而學習Asp.net MVC的,我想你的第一個經曆或許是那些曾經讓你的編程變得愉悅無比的服務端控 件都駕鶴西去了.FileUpload就是其中一個,而這個控制項的缺席給我們帶來一些小問題。這篇文章主要說如何在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" />
<% }%>

注意<input type=”file”>標籤的name屬性,我們在後面再討論,上面代碼會如下圖:

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();
  }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.