2013-02-18 10 views

Odpowiedz

10

Dodaj warunek dostępu do kodu tak, że sprawdza przeciwko mieniu blob ETag - symbole wieloznaczne są dozwolone, więc chcemy tylko pozwalają na przesyłanie jeśli żadne plamy o tej nazwie ma żadnych wytycznych (co jest okrężny sposób powiedzenia, czy istnieje nazwa kropelki).

Otrzymujesz wyjątek StorageException zgodnie z opisem poniżej.

CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); 
try { 
    blockBlob.UploadFromStream(stream, accessCondition: AccessCondition.GenerateIfNoneMatchCondition("*")); 
} catch (StorageException ex) { 
    if (ex.RequestInformation.HttpStatusCode == (int)System.Net.HttpStatusCode.Conflict) 
     // Handle duplicate blob condition 
    } 
    throw; 
} 
0

Można również sprawdzić, czy istnieje blob, a następnie przesłać coś takiego:

CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); 
if (!blockBlob.Exists()) 
{ 
    blockBlob.UploadFromStream(stream) 
} 

Jeśli nie masz Występuje metody, sprawdź tę odpowiedź Checking if a blob exists in Azure Storage.

+4

Jak rozumiem, to może nie działać, jeśli masz wielu klientów z dostępem do kontenera - jak kropelka może zostać utworzony przez inny wątek/system/klient między tym wątku ' Exist'' i instrukcja wysyłania. Możesz przetestować ten scenariusz przed użyciem rozwiązania Exists w środowisku z wieloma klientami. –

4

Odpowiedź udzielona przez Rob Churcha wydaje się być w porządku. Sprawdzanie ciągów błędów nie jest najlepsze praktyki i być ulepszone:

 CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName); 
     try 
     { 
      blockBlob.UploadFromStream(stream, accessCondition: AccessCondition.GenerateIfNoneMatchCondition("*")); 
     } 
     catch (StorageException ex) 
     { 
      if (ex.RequestInformation.HttpStatusCode == (int)System.Net.HttpStatusCode.Conflict) 
      { 
       // Handle duplicate blob condition 
      } 
      throw; 
     } 
3

Azure ma teraz warunek dostępu, który będzie tylko dodać, nie nadpisać: AccessCondition.GenerateIfNotExistsCondition()

Definicja:

konstruuje warunek dostępu taki, że operacja zostanie wykonana tylko wtedy, gdy zasób nie istnieje.

Przykład:

var accessCondition = AccessCondition.GenerateIfNotExistsCondition(); 
blockBlob.UploadFromStream(stream, accessCondition); 
Powiązane problemy