C# Multipart form-data in HttpClient Post REST API

18,236

All, Finally i am able to reproduce the Postman code in C# programmatically.

I able to add the "metadata" property in the multipart form-data.

Reference: Upload Files Using HttpClient

string Seshat_URL = "https://azr-stg.dev03.abs.ase.southcentralus.us.wc.net/files/v11";
      using (var multiPartStream = new MultipartFormDataContent())
                {

                    multiPartStream.Add(new StringContent("{}"), "metadata");
                    multiPartStream.Add(new ByteArrayContent(filecontent, 0, filecontent.Length), "file", docName);
                    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, Seshat_URL);
                    request.Content = multiPartStream;
                    //"application/json" - content type
                    request.Headers.Accept.Add(JSON_GENERIC_MEDIA_TYPE);  
                    request.Headers.Add("X-Client-Id", ClientId);                
                    request.Headers.Add("Tenant-Id", TenantId);

                    HttpCompletionOption option = HttpCompletionOption.ResponseContentRead;
                    System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

                    using (HttpResponseMessage response = _httpClient.SendAsync(request, option).Result)
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            var deserializedObject = JsonConvert.DeserializeObject<Wc.MCM.UIMVC.Helpers1.BlobResponse>(response.Content.ReadAsStringAsync().Result);
                            return deserializedObject.fileId.ToString();
                        }                        
                    }

                }//End Try
Share:
18,236
AdithyaM
Author by

AdithyaM

Updated on June 04, 2022

Comments

  • AdithyaM
    AdithyaM over 1 year

    Below is the code from Postman. I need to send this Body and Header in the POST Request

    var client = new RestClient("https://azr-stg.dev03.abs.ase.southcentralus.us.wc.net/files/v11");
    var request = new RestRequest(Method.POST);
    request.AddHeader("cache-control", "no-cache");
    request.AddHeader("Content-Type", "application/pdf");
    request.AddHeader("X-Client-Id", "94437320-3bcf-498d-915a");
    request.AddHeader("Tenant-Id", "0d3ad0cd-3bb3-4fc0-bd15");
    request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA");
    request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA", "------WebKitFormBoundary7MA\r\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.pdf\"\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary7MA\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n\r\n------WebKitFormBoundary7MA--", ParameterType.RequestBody);
    IRestResponse response = client.Execute(request);
    
    

    The above post is working good in Postman and able to upload the file, but i want to do this in programmatically. The API accepts content types ( like text, pdf, image files ).

    how to format the body and header content to send the above with HttpClient request using multipart form-data

    Here is where I am with example code for HttpClient. I am getting bad request / internal server error.

    HttpClient _httpclient = new HttpClient()
    using (var multiPartStream = new MultipartFormDataContent())
    {
    
    
    
    MemoryStream stream = new MemoryStream(filecontent);
    //JsonSerializer.WriteObject(stream, newDocument);
    ByteArrayContent firstPart = new ByteArrayContent(stream.ToArray());
    firstPart.Headers.ContentType = JSON_GENERIC_MEDIA_TYPE;
    firstPart.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "metadata" };
    multiPartStream.Add(firstPart);
    stream.Dispose();
    
    
    StreamContent otherContent = new StreamContent(content);
    otherContent.Headers.ContentType = new MediaTypeHeaderValue(applicationContentType);
    //otherContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file" };
    otherContent.Headers.Add("Content-Disposition", $"form-data; name=\"file\"; filename=\"{docFullName}\"");
    
    multiPartStream.Add(otherContent);
    
    
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, urlTwo);
    request.Content = multiPartStream;
    
    
     request.Headers.Accept.Add(“application/json”);
     request.Headers.Add("X-Client-Id", "94437320-3bcf-498d-915a");
     request.Headers.Add("Tenant-Id", "0d3ad0cd-3bb3-4fc0-bd15");
     HttpCompletionOption option = HttpCompletionOption.ResponseContentRead;
    
    using (HttpResponseMessage response = _httpClient.SendAsync(request, option).Result)
    {
    
    if (response.IsSuccessStatusCode)
    {
      var deserializedObject = JsonConvert.DeserializeObject<Walmart.MDM.MasterUIMVC.Helpers1.RootObject>(response.Content.ReadAsStringAsync().Result);
      return deserializedObject.properties.r_object_id.ToString();
    }
    
    

    Appreciate any help.