post multipart/form-data in c# HttpClient 4.5

15,354

This method works for me. You can use form data and file

public async Task<bool> Upload(FileUploadRequest model)
{
    var httpClientHandler = new HttpClientHandler()
    {
      Proxy = new WebProxy("proxyAddress", "proxyPort")
      {
        Credentials = CredentialCache.DefaultCredentials
      },
      PreAuthenticate = true,
      UseDefaultCredentials = true
    };


    var fileContent = new StreamContent(model.File.OpenReadStream())
    {
       Headers =
       {
           ContentLength = model.File.Length,
           ContentType = new MediaTypeHeaderValue(model.File.ContentType)
       }
    };

    var formDataContent = new MultipartFormDataContent();
    formDataContent.Add(fileContent, "File", model.File.FileName);          // file
    formDataContent.Add(new StringContent("Test Full Name"), "FullName");   // form input

    using (var client = new HttpClient(handler: httpClientHandler, disposeHandler: true))
    {
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " + tokenString);

        using (var res = await client.PostAsync("http://filestorageurl", formDataContent))
        {
           return res.IsSuccessStatusCode;
        }
    }
}
Share:
15,354

Related videos on Youtube

Malik Kashmiri
Author by

Malik Kashmiri

Updated on June 04, 2022

Comments

  • Malik Kashmiri
    Malik Kashmiri almost 2 years

    Problem

    I am trying to post API to send data to API which calls my internal API service to send that data to other API i service. Entity contains property with files . this send only file to the other derive but the NameSender property not send with the file.

    Entity

    public class Email
    {
    
        public string NameSender{ get; set; }
    
        public List<IFormFile> Files { get; set; }
    
    
    }
    

    Api

    [Consumes("multipart/form-data")]
    [HttpPost]
    public IActionResult SendEmail([FromForm]Entity entity)
    {
        try
        {
            string Servicesfuri = this.serviceContext.CodePackageActivationContext.ApplicationName + "/" + this.configSettings.SendNotificationServiceName;
    
            string proxyUrl = $"http://localhost:{this.configSettings.ReverseProxyPort}/{Servicesfuri.Replace("fabric:/", "")}/api/values/Send";
    
            //attachments
            var requestContent = new MultipartFormDataContent();
    
    
            foreach (var item in entity.Files)
            {
                StreamContent streamContent = new StreamContent(item.OpenReadStream());
                var fileContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
                requestContent.Add(fileContent, item.Name, item.FileName);
    
            }
    
            HttpResponseMessage response = this.httpClient.PostAsync(proxyUrl, requestContent).Result;
    
    
            if (response.StatusCode != System.Net.HttpStatusCode.OK)
            {
                return this.StatusCode((int)response.StatusCode);
            }
    
            return this.Ok(response.Content.ReadAsStringAsync().Result);
        }
        catch (Exception e)
        {
            throw e;
        }
    }