ASP.NET WebApi: how to perform a multipart post with file upload using WebApi HttpClient
69,842
Solution 1
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;
}
}
Solution 2
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.
Solution 3
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);
Author by
Michael Teper
Updated on April 28, 2020Comments
-
Michael Teper about 4 years
I have a WebApi service handling an upload from a simple form, like this one:
<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>
However, I can't figure out how to simulate the same post using the HttpClient API. The
FormUrlEncodedContent
bit is simple enough, but how do I add the file contents with the name to the post? -
Michael Teper about 12 yearsThat doesn't work, unfortunately, although the
ContentDisposition
header does seems to take me a step forward. If I use your sample code as is, I get anUnsupported Media Type
exception. However, if I replaceMultipartContent
withMultipartFormDataContent
the exception goes away. On the server, however, the value of the hidden field is missing. -
Aliostad about 12 years@MichaelTeper I have not tested the code. I will play a bit with it and update the post, but my point was to show you a snippet of what you need to look for and not a working code.
-
Jalal El-Shaer almost 12 yearsUse StreamContent for large files: var fileContent = new StreamContent(File.OpenRead(fileName));
-
Matthew Pitts over 11 yearsWoohoo -- I had a totally different issue, but needed to post content nonetheless. I was able to modify to fit my needs. Thanks a lot!!
-
deerchao about 11 yearsStrangely this does not work for me. I had to add quotes around the content names, see this: stackoverflow.com/questions/15638622/…
-
Michael Teper about 11 years@deerchao I think the difference is in how you process the post on the back-end. In my case, I was using WebApi and
MultipartFormDataStreamProvider
. -
Robert over 9 yearsFYI, there is a constant for "attachment" under System.Net.Mime.DispositionTypeNames
-
Rob Bird over 9 yearsI too had to add quotes around the name value: FileName = "\"TestImage.jpg\"". I am using ServiceStack on the server instead of WebAPI not sure if that is related or not.
-
djack109 about 4 yearsI keep getting
StatusCode: 415, ReasonPhrase: 'Unsupported Media Type'
, any ideas ? -
djack109 about 4 yearsI just get
StatusCode: 415, ReasonPhrase: 'Unsupported Media Type'