ASP.NET WebApi: how to perform a multipart post with file upload using WebApi HttpClient ASP.NET WebApi: how to perform a multipart post with file upload using WebApi HttpClient asp.net asp.net

ASP.NET WebApi: how to perform a multipart post with file upload using WebApi HttpClient


After much trial and error, here's code that actually works:

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;    }}


Thank you @Michael Tepper for your answer.

I had to post attachments to MailGun (email provider) and I had to modify it slightly so it would accept my attachments.

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);

Here for future reference. Thanks.


You need to look for various subclasses of HttpContent.

You create a multiform http content and add various parts to it. In your case you have a byte array content and form url encoded along the lines of:

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);