Search code examples
c#asp.netasp.net-web-apidotnet-httpclient

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


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?


Solution

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