ASP.NET WebApi:如何使用WebApi HttpClient执行file upload的多部分文章

我有一个WebApi服务处理从一个简单的forms,如这样的上传:

<form action="/api/workitems" enctype="multipart/form-data" method="post"> <input type="hidden" name="type" value="ExtractText" /> <input type="file" name="FileForUpload" /> <input type="submit" value="Run test" /> </form> 

但是,我不知道如何使用HttpClient API模拟相同的职位。 FormUrlEncodedContent位很简单,但是如何将文件内容的名称添加到文章中?

经过多次试验和错误之后,下面是实际工作的代码:

 using (var client = new HttpClient()) { using (var content = new MultipartFormDataContent()) { var values = new[] { new KeyValuePair<string, string>("Foo", "Bar"), new KeyValuePair<string, string>("More", "Less"), }; foreach (var keyValuePair in values) { content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key); } var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Foo.txt" }; content.Add(fileContent); var requestUri = "/api/action"; var result = client.PostAsync(requestUri, content).Result; } } 

你需要寻找HttpContent各种子类。

您创build一个多forms的http内容并添加各种部分。 在你的情况下,你有一个字节数组的内容和formsURL编码沿线

 HttpClient c = new HttpClient(); var fileContent = new ByteArrayContent(new byte[100]); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "myFilename.txt" }; var formData = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("name", "ali"), new KeyValuePair<string, string>("title", "ostad") }); MultipartContent content = new MultipartContent(); content.Add(formData); content.Add(fileContent); c.PostAsync(myUrl, content); 

谢谢@Michael Tepper的回答。

我不得不将附件发送到MailGun(电子邮件提供商),我不得不稍微修改它,因此它会接受我的附件。

 var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") //<- 'form-data' instead of 'attachment' { Name = "attachment", // <- included line... FileName = "Foo.txt", }; multipartFormDataContent.Add(fileContent); 

这里供将来参考。 谢谢。