0

Currently I have working code which uses Flurl to issue http post request to my endpoint.

string endPoint = "/api/abcs/";
string url = string.Format("{0}{1}{2}", baseUrl, endPoint, clientId);
var response = await url.SetQueryParams(id, code)         
            .PostMultipartAsync(mp => mp
            .AddString("field1", postData.field1)
            .AddString("field2", postData.field2)
            .AddString("field3", postData.field3)
            );

This code works. In my endpoint, I can get my data for field1, field2, field3. But now in field4, I have file upload data. So I serialize the object to json. Below, is my amended code.

string endPoint = "/api/abcs/";
var myContent = JsonConvert.SerializeObject(postData);
var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

string url = string.Format("{0}{1}{2}", baseUrl, endPoint, ecddClientId);
var response = await url.SetQueryParams(id, code)         
            .PostMultipartAsync(mp => mp
            .AddJson("json", myContent));

But, now when I debug it at my endpoint, I can't see the data already.

This is my endpoint code

[HttpPost]
public async Task<IHttpActionResult> PutHello(int id, string code)
{
    string root = Path.GetTempPath();
    var provider = new MultipartFormDataStreamProvider(root);

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

    var field1 = provider.FormData["field1"];
    var field2 = provider.FormData["field2"];
    var field3 = provider.FormData["field3"];
    var field4 = provider.FormData["field4"];
}

1 Answer 1

1
+50

mulipart/form-data requests will be supported in Flurl.Http 1.0 via the following syntax:

var resp = await "http://api.com".PostMultipartAsync(mp => mp
    .AddString("name", "hello!")                // individual string
    .AddStringParts(new {a = 1, b = 2})         // multiple strings
    .AddFile("file1", path1)                    // local file path
    .AddFile("file2", stream, "foo.txt")        // file stream
    .AddJson("json", new { foo = "x" })         // json
    .AddUrlEncoded("urlEnc", new { bar = "y" }) // URL-encoded                      
    .Add(content));                             // any HttpContent

Ref: Link

Sign up to request clarification or add additional context in comments.

3 Comments

but which one should I use for file upload? so far I know only .AddString
use AddFile. ex: .AddFile("UploadFile", new MemoryStream(data), appFile.FileName)
what about if it is an array? var field5 = provider.FormData["field5[]"]; I tried with .AddString but I just the null value.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.