MultipartFormDataStreamProvider用于上传mime文件和表单数据

时间:2012-10-14 16:11:16

标签: asp.net-mvc-4

由于Azure要求,使用RTM版本,Framework 4 代码在Azure模拟器上运行时出错 - 我怀疑问题与路径/环境变量有关。 在Azure Web角色上失败,出现404错误

以下是控制器代码:

  [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<AzureBlobStorageMultipartProvider>(multipartStreamProvider).ContinueWith<List<FileDetails>>(t =>
          {
              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);
      }
  }

这是覆盖

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();
    }

1 个答案:

答案 0 :(得分:1)

我解决了这个问题,这是一些小事,与路径无关,这是正确完成的。