我开始使用ASP.NET MVC,但想进一步探索。我已经走过了通常的“你好,世界”的例子,现在我想尝试一些更复杂的东西。具体来说,我希望能够:
在这种情况下,我想做的处理是微不足道的,证明我确实得到了XML文件并对其进行了检查。例如,计算<basket>
元素的数量就足够了。在我进行处理之后,我想将结果作为新文件流式传输给用户(例如,文本文件只包含句子“有398 <basket>
个元素”),以便他们的浏览器启动下载。
对此有什么好的一般方法?
答案 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" );
}