2012-10-14 16 views
4

由于Azure要求使用RTM版本Framework 4 代码在Azure模拟器上处理out out错误 - 我怀疑问题与路径/环境变量有关。 失败与一个404错误MultipartFormDataStreamProvider上传mime文件和表单数据

这里Azure的Web角色是控制器代码:

[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

我希望你详细阐述这个问题。我使用该博客上提供的代码来解决404问题。 –

相关问题