2009-10-31 52 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