Brian Jenkins
Brian Jenkins

Reputation: 368

Send a 'Stream' over a PutAsync request

I'm trying my hand at .NET Core but I'm stuck trying to convert multipart/form-data to an application/octet-stream to send via a PUT request. Anybody have any expertise I could borrow?

[HttpPost("fooBar"), ActionName("FooBar")]
public async Task<IActionResult> PostFooBar() {
    HttpResponseMessage putResponse = await _httpClient.PutAsync(url, HttpContext.Request.Body);
}

Update: I think I might have two issues here:

  1. My input format is multipart/form-data so I need to split out the file from the form data.

  2. My output format must be application-octet stream but PutAsync expects HttpContent.

Upvotes: 0

Views: 2723

Answers (2)

Brian Jenkins
Brian Jenkins

Reputation: 368

Turns out Request has a Form property that contains a Files property that has an OpenReadStream() function on it to convert it into a stream. How exactly I was supposed to know that, I'm not sure.

Either way, here's the solution:

StreamContent stream = new StreamContent(HttpContext.Request.Form.Files[0].OpenReadStream());

HttpResponseMessage putResponse = await _httpClient.PutAsync(url, stream);

Upvotes: 1

redcrowe
redcrowe

Reputation: 191

I had been trying to do something similar and having issues. I needed to PUT large files (>1.5GB) to a bucket on Amazon S3 using a pre-signed URL. The implementation on Amazon for .NET would fail for large files.

Here was my solution:

static HttpClient client = new HttpClient();
client.Timeout = TimeSpan.FromMinutes(60);


    static async Task<bool> UploadLargeObjectAsync(string presignedUrl, string file)
    {
        Console.WriteLine("Uploading " + file + " to bucket...");          

        try
        {
            StreamContent strm = new StreamContent(new FileStream(file, FileMode.Open, FileAccess.Read));
            strm.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
            HttpResponseMessage putRespMsg = await client.PutAsync(presignedUrl, strm);              
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            return false;
        }

        return true;

    }

Upvotes: 1

Related Questions