2016-08-30 58 views
1

我想將內容上傳到azure blob,大小超過32MB。下面的C#代碼片斷:增加Azure blob塊上傳限制從32 MB

CloudBlockBlob blob = _blobContainer.GetBlockBlobReference(blobName); 
blob.UploadFromByteArray(contents, 0, contents.Length, AccessCondition.GenerateIfNotExistsCondition(), options:writeOptions); 

每次團塊超過32MB,上述引發一個例外:

Exception thrown: 'Microsoft.WindowsAzure.Storage.StorageException' in Microsoft.WindowsAzure.Storage.dll 

Additional information: The remote server returned an error: (404) Not Found. 

作爲每this

當塊斑點上傳大於此屬性中的值 存儲客戶端將文件分解成塊。

應該有單獨的代碼行來啓用它。

+0

我試過你的代碼沒有writeOptions參數,它可以正常工作與35MB的文件。 – fred

+0

我也能夠上傳一個35 MB的字節數組到一個塊blob沒有錯誤。客戶端庫處理使用此方法時將數據上傳爲塊的工作;沒有什麼你需要做的。 –

+0

您的代碼存在一個問題:UploadFromByteArray沒有重載參數的組合,因此此代碼不應編譯。 –

回答

2

存儲客戶端默認爲32 MB的最大單塊上傳。當塊blob上載大於SingleBlobUploadThresholdInBytes屬性中的值時,存儲客戶端會將該文件分解爲塊。

正如Tamra所說,存儲客戶端處理將文件分塊的工作。這是我的測試,讓你更好地理解它。

代碼示例

CloudBlockBlob blob = container.GetBlockBlobReference(blobName); 
var writeOptions = new BlobRequestOptions() 
{ 
    SingleBlobUploadThresholdInBytes = 50 * 1024 * 1024, //maximum for 64MB,32MB by default   
}; 
blob.UploadFromByteArray(contents, 0, contents.Length, AccessCondition.GenerateIfNotExistsCondition(), options: writeOptions); 

方案

  1. 如果你正在寫一個塊斑點是沒有大小比SingleBlobUploadThresholdInBytes屬性的更多,你可以上傳它的全部只需一次寫操作。

    當您調用UploadFromByteArray方法時,您可以通過使用Fiddler捕獲網絡包來了解它。

  2. 當一個塊的斑點上載比在大小SingleBlobUploadThresholdInBytes屬性值越大,存儲客戶端自動中斷文件爲塊。

    我上傳一個blob其尺寸幾乎是90MB,那麼你會發現區別如下:

    在快照,你可以發現,存儲客戶端在打破檔案成塊,帶有4MB大小並同時上傳塊。

每次一滴超過32MB,上述拋出一個異常

你可以試試,當你調用UploadFromByteArray方法查找設置SingleBlobUploadThresholdInBytes屬性或捕獲網絡包詳細的錯誤。