Sending HTTP POST Multipart/form-data field using RestSharp

55,677

Solution 1

So I am doing this by working around a problem with using the AddBody method which automatically kills the multi part form images and will not send them. You must use add parameter instead.

To solve this problem you may have to do a little work on both sides of the communication.

To send the message from the client you do the following:

new RestRequest("<Your URI>");
request.AddParameter("request", tokenRequest.ToJson());
request.AddFile("front", frontImage.CopyTo, "front");
request.AddFile("back", backImage.CopyTo, "back");
request.AddHeader("Content-Type", "multipart/form-data");

On my web service side, I accept the json as the argument to the method and manually obtain a reference to the file streams:

public JsonResult MyService(StoreImageRequest request)
{
    var frontImage = HttpContext.Request.Files["front"].InputStream;
    var backImage = HttpContext.Request.Files["front"].InputStream;
}

Solution 2

Multi-part request with JSON body + File parts

If your server can process a multi-part with JSON body and Files parts, then

Client code:

        var req = new RestRequest(UPLOAD_DOC_URLSEGMENT, Method.POST);

        req.RequestFormat = DataFormat.Json;
        req.AddBody(doc);

        req.AddFileBytes("TestImage", Properties.Resources.TestImage, "TestImage.jpg");

        req.AddHeader("apikey", "MY-API-KEY");
        var resp = restClient.Execute<ApiResult>(req);

Server code:

At the server side such multi-part request should be processed as:

    [HttpPost]
    public JsonResult UploadDoc()
    {
        // This is multipart request. So we should get JSON from http form part:
        MyDocModel doc = JsonConvert.DeserializeObject<MyDocModel>(Request.Form[0]);
        
        foreach (string fileName in request.Files)
        {
            HttpPostedFileBase file = request.Files[fileName];
        }
Share:
55,677
JNYRanger
Author by

JNYRanger

Just a guy who works in the Software &amp; IT world and enjoys programming in both a professional and hobbyist setting.

Updated on July 18, 2022

Comments

  • JNYRanger
    JNYRanger almost 2 years

    I'm having issues using RestSharp for a REST API I need to use for a project I'm working on. The request I need to issue is in three parts: A header API key, a file to upload, and a bunch of data in JSON format. The API requires that the data part be sent using a form field name of "data". For some reason this is causing issues since it's naming the field "data" within the body of the request.

    The code I have as is as follows:

    var request = new RestRequest(UPLOAD_DOC_URLSEGMENT, Method.POST)
    {
        RequestFormat = DataFormat.Json,
        AlwaysMultipartFormData = true,
        JsonSerializer = new RestSharpJsonDotNetSerializer(customSerializer)
    };
    
    if (doc is DocA)
        request.AddParameter("data",doc as DocA,ParameterType.RequestBody);
        //request.AddBody(doc as DocA);
    else
        request.AddParameter("data", doc as DocB,ParameterType.RequestBody);
        //request.AddBody(doc as DocB);
    
    request.AddFile("file", doc.File.FullName);
    

    As you can see I've attempted to use both the request.AddBody(doc) method and the request.AddParameter(name, object, type) method. Neither of them appear to be sending the data properly because I receive a response from the server saying required parameters are missing. Using fiddler I can see the binary data, but never the JSON data with both of these methods. I've gone through the RestSharp documentation, but I can't find anything that allows me to specify a particular "field" name as "data" for the form data body, which is what I believe is causing the issue I'm having. What am I doing wrong here?

    EDIT: Upon further inspection with fiddler it appears that it's not adding my JSON data at all to the body of the HTTP request. However, with a break point right before the upload (execute command) I can see everything serialized properly within the parameter list (and file list). When inspecting the with Fiddler I see the file binary data, and then a multipart/form-data boundary, and then nothing. I would assume this is where my data is supposed to be...