ASP.NET MVC中的简单上载/下载表单

时间:2009-10-31 12:49:02

标签: asp.net-mvc xml file

我开始使用ASP.NET MVC,但想进一步探索。我已经走过了通常的“你好,世界”的例子,现在我想尝试一些更复杂的东西。具体来说,我希望能够:

  • 上传一些XML文件,
  • 对其进行一些简单的处理,然后
  • 允许用户下载包含处理结果的新文件

在这种情况下,我想做的处理是微不足道的,证明我确实得到了XML文件并对其进行了检查。例如,计算<basket>元素的数量就足够了。在我进行处理之后,我想将结果作为新文件流式传输给用户(例如,文本文件只包含句子“有398 <basket>个元素”),以便他们的浏览器启动下载。

对此有什么好的一般方法?

1 个答案:

答案 0 :(得分:3)

要进行上传,您需要有一个文件输入和一个使用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" );
}