Http MultipartFormDataContent

98,899

Solution 1

Posting MultipartFormDataContent in C# is simple but may be confusing the first time. Here is the code that works for me when posting a .png .txt etc.

// 2. Create the url 
string url = "https://myurl.com/api/...";
string filename = "myFile.png";
// In my case this is the JSON that will be returned from the post
string result = "";
// 1. Create a MultipartPostMethod
// "NKdKd9Yk" is the boundary parameter

using (var formContent = new MultipartFormDataContent("NKdKd9Yk"))
{
    formContent.Headers.ContentType.MediaType = "multipart/form-data";
    // 3. Add the filename C:\\... + fileName is the path your file
    Stream fileStream = System.IO.File.OpenRead("C:\\Users\\username\\Pictures\\" + fileName);
    formContent.Add(new StreamContent(fileStream), fileName, fileName);

    using (var client = new HttpClient())
    {
        // Bearer Token header if needed
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _bearerToken);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));

        try
        {
            // 4.. Execute the MultipartPostMethod
            var message = await client.PostAsync(url, formContent);
            // 5.a Receive the response
            result = await message.Content.ReadAsStringAsync();                
        }
        catch (Exception ex)
        {
            // Do what you want if it fails.
            throw ex;
        }
    }    
}

// 5.b Process the reponse Get a usable object from the JSON that is returned
MyObject myObject = JsonConvert.DeserializeObject<MyObject>(result);

In my case I need to do something with the object after it posts so I convert it to that object with JsonConvert.

Solution 2

I know this is an old post But to those searching for a solution, to provide a more direct answer, here's what I've found:

using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

public class UploadController : ApiController
{
    public async Task<HttpResponseMessage> PostFormData()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                Trace.WriteLine("Server file path: " + file.LocalFileName);
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (System.Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }
}

Here's where I found it: http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2

For a more Elaborate implementation: http://galratner.com/blogs/net/archive/2013/03/22/using-html-5-and-the-web-api-for-ajax-file-uploads-with-image-preview-and-a-progress-bar.aspx

Solution 3

I debugged this the problem is here:

method.Add(streamContent, "filename");

This 'Add' doesn't actually put the file in the BODY of Multipart Content.

Share:
98,899
user2985419
Author by

user2985419

Updated on December 23, 2020

Comments

  • user2985419
    user2985419 over 3 years

    I have been asked to do the following in C#:

    /**
    
    * 1. Create a MultipartPostMethod
    
    * 2. Construct the web URL to connect to the SDP Server
    
    * 3. Add the filename to be attached as a parameter to the MultipartPostMethod with parameter name "filename"
    
    * 4. Execute the MultipartPostMethod
    
    * 5. Receive and process the response as required
    
    * /
    

    I have written some code that has no errors, however, the file is not attached.

    Can someone have a look at my C# code to see if I have written the code incorrectly?

    Here is my code:

    var client = new HttpClient();
    const string weblinkUrl = "http://testserver.com/attach?";
    var method = new MultipartFormDataContent();
    const string fileName = "C:\file.txt";
    var streamContent = new StreamContent(File.Open(fileName, FileMode.Open));
    method.Add(streamContent, "filename");
    
    var result = client.PostAsync(weblinkUrl, method);
    MessageBox.Show(result.Result.ToString());