title: MultipartFormDataStreamProvider to upload mime file and form data
body: <p>Using RTM version, Framework 4 due to Azure Requirements
  Code works with out error on Azure emulator - i suspect the issue has to do with the path/environment variable.
  Fails on Azure web role with a 404 error</p>
  
  <p>Here is the Controller Code:</p>
  
  <pre><code>  [ValidateInput(false)]
    public HttpResponseMessage Post()
    {
        try
        {
            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }
            string tempPath = RoleEnvironment.GetLocalResource("tempStorage").RootPath;
            Environment.SetEnvironmentVariable("TEMP", tempPath);
            Environment.SetEnvironmentVariable("TMP", tempPath);
  
            string Host = "test";
            string StorageConnection = "credentials here";
            string Product = "Product";
            string CompanyID = "Company";
            DocStorage docStorage = new DocStorage(Host, Product, CompanyID, StorageConnection);
            var multipartStreamProvider = new AzureBlobStorageMultipartProvider(docStorage.BlobContainer, tempPath);
            Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
            if (reqStream.CanSeek)
            {
                reqStream.Position = 0;
            }
  
            Request.Content.ReadAsMultipartAsync&lt;AzureBlobStorageMultipartProvider&gt;(multipartStreamProvider).ContinueWith&lt;List&lt;FileDetails&gt;&gt;(t =&gt;
            {
                if (t.IsFaulted)
                {
                    throw t.Exception;
                }
                AzureBlobStorageMultipartProvider provider = t.Result;
  
                foreach (var fileData in provider.FileData)
                {
                    string fileName = Path.GetFileName(fileData.Headers.ContentDisposition.FileName.Trim('"'));
                    string fileNameBlob = Path.GetFileName(fileData.LocalFileName.Trim('"'));
                    CloudBlob blob = docStorage.BlobContainer.GetBlobReference(fileNameBlob);
  
                       if (!string.IsNullOrEmpty(provider.FormData["company"])) 
                          blob.Metadata[AriettDocStorage.FileNameFileLocation] = provider.FormData["company"];
                    blob.SetMetadata();
                }
                return provider.Files;
            });
            return new HttpResponseMessage(HttpStatusCode.OK);
        }
        catch
        {
            return new HttpResponseMessage(HttpStatusCode.NotFound);
        }
    }
  </code></pre>
  
  <p>Here is the override</p>
  
  <pre><code>public class AzureBlobStorageMultipartProvider : MultipartFormDataStreamProvider
  {
      public CloudBlobContainer Container;
      public AzureBlobStorageMultipartProvider(CloudBlobContainer container, string tempPath)
          : base(tempPath)
      {
          Container = container;
      }
      public override Task ExecutePostProcessingAsync()
      {
          // Upload the files to azure blob storage and remove them from local disk 
          foreach (var fileData in this.FileData)
          {
              string fileName = Path.GetFileName(fileData.Headers.ContentDisposition.FileName.Trim('"'));
  
              // Retrieve reference to a blob 
              string fileNameBlob = Path.GetFileName(fileData.LocalFileName.Trim('"'));
  
              CloudBlob blob = Container.GetBlobReference(fileNameBlob);
              blob.Properties.ContentType = fileData.Headers.ContentType.MediaType;
              blob.UploadFile(fileData.LocalFileName);
              blob.SetProperties();
              File.Delete(fileData.LocalFileName);
              Files.Add(new FileDetails
              {
                  ContentType = blob.Properties.ContentType,
                  Name = blob.Name,
                  Size = blob.Properties.Length,
                  Location = blob.Uri.AbsoluteUri
              });
          }
  
          return base.ExecutePostProcessingAsync();
      }
  </code></pre>