2013-07-31 34 views
21

我很努力地理解,为什么我想使用MultipartFormDataStreamProvider,当我可以使用HttpContext.Current获取所有信息。MultipartFormDataStreamProvider vs HttpContext.Current

这是很容易做到这一点:

var mydata = HttpContext.Current.Request.Form["mydata"]; 

比这

string root = HttpContext.Current.Server.MapPath("~/somedir"); 
var provider = new MultipartFormDataStreamProvider(root); 

this.Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t => 
{ 
    var mydata = provider.Contents.First(c => c.Headers.ContentDisposition.Name == "\"mydata\"").ReadAsStringAsync().Result; 
}); 

PS - 我想建立一个ApiController接受文件上传。我读过这篇文章http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-2

+2

原因之一是能够异步读取内容。 – Michael

+3

另一个原因是,由于您依赖于'HttpContext.Current',因此这不适用于自我托管的场景。 –

+0

看来不幸的是,使用WebAPI时使用此方法需要将文件写入指定路径中的磁盘。没有官方文档指出写什么,为什么,或者表明应用程序负责删除文件。考虑到该文件的很多开销已经在流中。 – simbolo

回答

3

这是我在MSDN上找到的。我认为这可能会帮助你。

流提供程序查看Content-Disposition标题字段,并根据文件名参数的存在性确定输出流。如果文件名参数存在于Content-Disposition标题字段中,则正文部分被写入FileStream,否则将其写入MemoryStream。这可以方便地处理MIME多部分HTML表单数据,它是表单数据和文件内容的组合。

+1

您可以指向使用HttpClient发布文件和表单数据的示例吗? – flipdoubt

+0

@flipdoubt我可以...给我一些时间我会添加到答案 – Guanxi

+0

我希望你还没有在这个例子上工作... – Andrew

相关问题