Upload File using RestClient as multipart/form-data in c#

12,727

I found the solution by just changing the few codes.

Updated Code :

       var request = new RestRequest("api/document", Method.POST);

        request.AddFile(Path.GetFileNameWithoutExtension(fullFileName), filepath);
        request.AddParameter("ReferenceType", ReferenceType.ToString());
        request.AddParameter("RefId", StudioEventEntryId.ToString());

        request.AlwaysMultipartFormData = true;

        IRestResponse response = client.Execute(request);
Share:
12,727
Ankit Patel
Author by

Ankit Patel

Updated on June 07, 2022

Comments

  • Ankit Patel
    Ankit Patel almost 2 years

    I am trying to upload files from the c# class using restClient (RestSharp) request. I am creating Method.POST method and add one Audio file to this request As multipart/form-data.

    Server throws an exception when I execute the request.

    Exception :

     System.ArgumentNullException: Value cannot be null.
     Parameter name: value
     at System.Enum.TryParseEnum(Type enumType, String value, Boolean ignoreCase, EnumResult& parseResult)
     at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)
     at Groove.Libraries.Helper.EnumHelper.ParseEnum[T](String value) in D:\project\Groove\Web\Groove\Libraries\Helper\EnumHelper.cs:line 47
     at Groove.Controllers.Api.DocumentController. 
     <PostDocumentUpload>d__5.MoveNext()
    

    RestClient Request Code :

    string api_url = "http://localhost:57997/";
    var fullFileName = "Adios.mp3";
    var filepath = @"C:\Users\Admin\Desktop\Adios.mp3";
    
    RestClient client = new RestClient(ApiModel.api_url);
    
    var request = new RestRequest("api/document", Method.POST);
    request.AddFile(Path.GetFileNameWithoutExtension(fullFileName), filepath);
    request.AddHeader("Content-Type", "multipart/form-data");
    request.AddParameter("ReferenceType",28,ParameterType.RequestBody);
    IRestResponse response = client.Execute(request);
    

    Server Code :

    public async Task<object> PostDocumentUpload()
        {
            try
            {
                // Make temp physical path where file to be saved
                var tempPath =
                    HttpContext.Current.Server.MapPath(string.Format("{0}/{1}", Constants.MediaResourceFolder,
                        Constants.MediaResorceTempFolder));
    
                // Check temporary path is exist or not, if not then create temporary folder
                if (!Directory.Exists(tempPath))
                {
                    Directory.CreateDirectory(tempPath);
                }
    
                // Create object of MyMultipartFormDataStreamProvider class
                var stream = new MultipartHelper(tempPath);
    
                // Save file at temp path
                await RequestContext.Request.Content.ReadAsMultipartAsync(stream);
    
                // Exception throw from Here,
                ReferenceType referenceType = EnumHelper.ParseEnum<ReferenceType>(stream.FormData["ReferenceType"]);
               // -------------other code     
            }
            catch (Exception ex)
            {
                return FailureResponse(ex);
            }
    

    I guess problem is that stream.FormData["ReferenceType"] is not set correctly from request.

    I don't want change the server code. because it working fine when you call from postman or browser.

    Can somebody pls help? Thanks