2013-02-18 7 views

Antwort

10

eine Zugriffsbedingung, um den Code hinzufügen, so dass es gegen die ETag Eigenschaft des Blobs prüft - Wildcards erlaubt sind, so wollen wir den Upload nur zuzulassen, wenn keine Blobs mit diesem Namen alle etag haben (was ein Umweg zu sagen, existiert dieser Blob Name).

Sie erhalten eine StorageException wie unten beschrieben.

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

Sie können auch überprüfen, ob der Blob vorhanden ist, und laden Sie dann, wie folgt aus:

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

Wenn Sie nicht über eine Methode existiert, lesen Sie in dieser Antwort Checking if a blob exists in Azure Storage.

+4

Wie ich es verstehe, könnte dies nicht funktionieren, wenn Sie die Container mehrere Clients haben Zugriff auf - wie der Blob von einem anderen Thread/system/Client zwischen diesem Thread erstellt werden könnte ' Existiert und die Upload-Anweisung. Möglicherweise möchten Sie dieses Szenario testen, bevor Sie die Exists-Lösung in einer Umgebung mit vielen Clients verwenden. –

4

Die Antwort von Rob Church scheint in Ordnung zu sein. Saiten auf Fehler zu überprüfen ist nicht Best Practice und mit Maßnahmen verbessert werden:

 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 nun eine Zugangsbedingung hat, die nur hinzufügen, nicht überschrieben werden: AccessCondition.GenerateIfNotExistsCondition()

Definition:

Konstrukten ein Zugriffsbedingung, so dass eine Operation nur durchgeführt wird, wenn die Ressource nicht existiert.

Beispiel:

var accessCondition = AccessCondition.GenerateIfNotExistsCondition(); 
blockBlob.UploadFromStream(stream, accessCondition); 
Verwandte Themen