title: How to get the stream for a Multipart file in webapi upload?
body: <p>I need to upload a file using Stream (Azure Blobstorage), and just cannot find out how to get the stream from the object itself. See code below.</p>
  
  <p>I'm new to the WebAPI and have used some examples. I'm getting the files and filedata, but it's not correct type for my methods to upload it. Therefore, I need to get or convert it into a normal Stream, which seems a bit hard at the moment :)</p>
  
  <p>I know I need to use <code>ReadAsStreamAsync().Result</code> in some way, but it crashes in the foreach loop since I'm getting two provider.Contents (first one seems right, second one does not).</p>
  
  <pre><code> [System.Web.Http.HttpPost]
      public async Task&lt;HttpResponseMessage&gt; Upload()
      {
          if (!Request.Content.IsMimeMultipartContent())
          {
              this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
          }
  
          var provider = GetMultipartProvider();
          var result = await Request.Content.ReadAsMultipartAsync(provider);
  
          // On upload, files are given a generic name like "BodyPart_26d6abe1-3ae1-416a-9429-b35f15e6e5d5"
          // so this is how you can get the original file name
          var originalFileName = GetDeserializedFileName(result.FileData.First());
  
          // uploadedFileInfo object will give you some additional stuff like file length,
          // creation time, directory name, a few filesystem methods etc..
          var uploadedFileInfo = new FileInfo(result.FileData.First().LocalFileName);
  
  
  
          // Remove this line as well as GetFormData method if you're not
          // sending any form data with your upload request
          var fileUploadObj = GetFormData&lt;UploadDataModel&gt;(result);
  
          Stream filestream = null;
  
          using (Stream stream = new MemoryStream())
          {
              foreach (HttpContent content in provider.Contents)
              {
                  BinaryFormatter bFormatter = new BinaryFormatter();
                  bFormatter.Serialize(stream, content.ReadAsStreamAsync().Result);
                  stream.Position = 0;
                  filestream = stream;
              }
          }
  
          var storage = new StorageServices();
          storage.UploadBlob(filestream, originalFileName);**strong text**
  
  
  
  private MultipartFormDataStreamProvider GetMultipartProvider()
      {
          var uploadFolder = "~/App_Data/Tmp/FileUploads"; // you could put this to web.config
          var root = HttpContext.Current.Server.MapPath(uploadFolder);
          Directory.CreateDirectory(root);
          return new MultipartFormDataStreamProvider(root);
      }
  </code></pre>