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