2017-05-29 66 views
1

我正在上傳中的文件AZURE blob storage using c# library。如果我上傳帶有byte []的文件,它將計算MD5(在AZURE門戶中驗證 - 顯示CONTENT-MD5值)。CONTENT-MD5缺失AZURE portal

CloudBlockBlob blockBlob = GetUserProjectsBlob(blobName); 
blockBlob.UploadFromByteArray(file, 0, file.Length); 

我需要上傳一個大文件到AZURE。所以我使用PutBlock & PutBlockList方法..

string blockHash = GetMd5FromStream(new MemoryStream(file)); 
blockBlob.PutBlock(blockId, new MemoryStream(file, true), blockHash); 
// To commit transaction 
blockBlob.PutBlockList(blockIDsBase64); 

但在上述情況下,CONTENT-MD5在AZURE門戶丟失。我也試過這個..

BlobRequestOptions opt = new BlobRequestOptions(); 
opt.StoreBlobContentMD5 = true; 
UseTransactionalMD5 = true; 
blockBlob.PutBlockList(blockIDsBase64, null, opt); 

但是還是沒有運氣。有關如何解決此問題的任何想法?

+0

是否有原因通過代碼實現?我只問,因爲AZCopy可能會更好地工作,如果你只是複製文件 –

+0

@JasonH我使用它的WebApi。 –

+0

我對另一個技術細節很感興趣 - 有沒有理由讓它逐塊上傳?爲什麼不是全blob上傳API('UploadFromFIle','UploadFromStream',...)爲您工作? – KFL

回答

1

在下面的代碼行:

string blockHash = GetMd5FromStream(new MemoryStream(file)); 
blockBlob.PutBlock(blockId, new MemoryStream(file, true), blockHash); 
// To commit transaction 
blockBlob.PutBlockList(blockIDsBase64); 

你實際計算數據塊的MD5哈希值。當存儲服務收到此數據時,它會執行哈希驗證以確保數據塊數據沒有損壞。

BlobRequestOptions opt = new BlobRequestOptions(); 
opt.StoreBlobContentMD5 = true; 
UseTransactionalMD5 = true; 
blockBlob.PutBlockList(blockIDsBase64, null, opt); 

上面的代碼並不指示存儲服務計算您要上傳的blob的散列值。您需要自己計算blob的MD5哈希,並將其作爲屬性的一部分發送,如下所示:

blockBlob.Properties.ContentMD5 = "computed hash"; 
blockBlob.PutBlockList(blockIDsBase64, null, opt); 
+0

上傳byte []時它是如何工作的? –

+1

當您上傳文件時沒有將其分塊,SDK會計算出MD5哈希值,這就是它出現的原因。如果您通過將文件分成塊來上傳文件,則SDK不會計算散列值。 –