public async Task <FileAccumulator> UploadFileAsync(MultipartReader reader) { try { var filename = Guid.NewGuid().ToString(); using (var destinationStream = await _context.GetBucket().OpenUploadStreamAsync(filename)) { var id = destinationStream.Id; // the unique Id of the file being uploaded var section = await reader.ReadNextSectionAsync(); while (section != null) { var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out ContentDispositionHeaderValue contentDisposition); if (hasContentDispositionHeader) { if (_requestHelper.HasFileContentDisposition(contentDisposition)) { filename = HeaderUtilities.RemoveQuotes(contentDisposition.FileName).ToString(); // write the contents of the file to stream using asynchronous Stream methods await section.Body.CopyToAsync(destinationStream); } } section = await reader.ReadNextSectionAsync(); } await destinationStream.CloseAsync(); // optional but recommended so Dispose does not block var extension = Path.GetExtension(filename); var newName = Guid.NewGuid().ToString() + extension; _context.GetBucket().Rename(id, newName); return(new FileAccumulator { Id = id.ToString(), Filename = filename }); } } catch (Exception e) { Console.WriteLine(e.Message); return(null); } }