2015-05-03 84 views
2

我正在使用Azure Block Blob Storage保留我的文件。這是我的代碼來上傳文件。Azure Block Blob存儲文件上傳奇怪問題

我在同一個請求中爲相同的文件調用兩次下面的方法; 該方法的第一個調用保存文件的預期,但第二次調用將文件保存爲0的長度,所以我不能顯示圖像,並沒有發生錯誤。

[HttpPost] 
    public ActionResult Index(HttpPostedFileBase file) 
    { 
     UploadFile(file); 
     UploadFile(file); 
     return View(); 
    } 

     public static string UploadFile(HttpPostedFileBase file){ 

     var credentials = new StorageCredentials("accountName", "key"); 

     var storageAccount = new CloudStorageAccount(credentials, true); 

     var blobClient = storageAccount.CreateCloudBlobClient(); 

     var container = blobClient.GetContainerReference("images"); 

     container.CreateIfNotExists(); 

     var containerPermissions = new BlobContainerPermissions 
     { 
      PublicAccess = BlobContainerPublicAccessType.Blob 
     }; 

     container.SetPermissions(containerPermissions); 

     var blockBlob = container.GetBlockBlobReference(Guid.NewGuid().ToString()); 

     blockBlob.Properties.ContentType = file.ContentType; 

     var azureFileUrl = string.Format("{0}", blockBlob.Uri.AbsoluteUri); 

     try 
     { 
      blockBlob.UploadFromStream(file.InputStream); 
     } 

     catch (StorageException ex) 
     { 
      throw; 
     } 
     return azureFileUrl ; 
    } 

我只是找到下面的解決方案,這是我的奇怪,但它沒有幫助。

Strange Sudden Error "The number of bytes to be written is greater than the specified ContentLength"

任何想法? 謝謝

+0

順便說一句,你爲什麼要調用這個方法兩次? –

回答

4

您需要重新設置流的位置回到開頭。將此行放在UploadFile方法的頂部。

file.InputStream.Seek(0, SeekOrigin.Begin); 
+0

感謝您的回覆,這解決了我的問題。其實我要重構這種方法來保存不同大小的圖像,我需要在同一個後動作中保存同一個文件的2個版本,所以我會用不同的寬度和高度參數調用它兩次,反正。這裏關於尋找方法的邏輯是什麼?我調用的方法,所以我實例化塊blob等不同的實例,爲什麼我需要再次從0開始? – revolver

+0

是的,但源文件(發佈的文件)的文件指針在將文件流式傳輸到第一個blob後位於該文件的末尾。所以,如果你要再讀一遍,你必須把它移回到開頭。 –

+0

再次感謝,這是一個很好的觀點。 – revolver