2009-10-31 50 views
0

我開始使用ASP.NET MVC,但想進一步探索。我已經走過了通常的「你好,世界」的例子,現在我想嘗試一些更復雜的事情。具體而言,我希望能夠到:簡單的上傳/下載表單在ASP.NET MVC

  • 上傳一些XML文件,
  • 做它的一些簡單的處理,然後
  • 允許用戶下載一個新的文件與處理
  • 結果

在這種情況下,我想要做的處理是一些微不足道的事情,證明我真的得到了XML文件並檢查了它。例如,計算<basket>元素的數量就足夠了。在完成處理之後,我想將結果作爲新文件流式傳輸給用戶(例如,僅包含句子「有398 <basket>元素」的文本文件),以便他們的瀏覽器將啓動下載。

這是一個很好的一般方法?

回答

2

要進行上傳,您需要有一個文件輸入和一個使用multipart/form-data enctype的表單。在服務器上,您從Request.Files集合元素中獲得一個與您的輸入標記名稱匹配的HttpPostedFileBase對象。然後你訪問文件對象上的流並讀取它。

一旦你有了數據,你就可以執行你的轉換 - 在這裏你正在讀取一個特定標籤的數量。然後你想從你的動作中返回一個FileResult。由於它實際上只是一個字符串,我建議將它寫入一個MemoryStream,然後倒回該字符串並從中創建一個FileResult。

<% using (Html.BeginForm("Upload","Controller",FormMethod.Post, new { enctype = "multipart/form-data")) 
    { %> 
    <label for="uploadFile">File:</label> 
    <input type="file" name="uploadFile" id="uploadFile" /> 
    <input type="submit" value="Upload" /> 
<% } %> 

代碼 - 因爲我認爲你最終想要做更復雜的東西,我會包含一些(未經測試/未編譯)不,你描述了什麼代碼(我認爲)。

public ActionResult Upload() 
{ 
    var file = Request.Files["uploadFile"]; 
    if (file == null) 
    { 
     ModelState.AddModelError("uploadFile", "No file specified"); 
     return View(); 
    } 

    var reader = new StreamReader(file.InputStream); 

    var doc = XDocument.Load(reader); 

    var count = doc.Descendants().Where(n => n.Name == "basket").Count(); 

    var output = new MemoryStream(); 
    var writer = new StreamWriter(output); 

    writer.Write("{0} baskets", count); 
    output.Seek(0, SeekOrigin.Begin); 

    return File(output, "text/plain", "count.txt"); 
} 
+0

這太棒了!我一回到午餐時間就會嘗試一下。謝謝你的幫助。 – 2009-10-31 13:46:42