2013-02-18 59 views

回答

10

增加接入条件的代码,以便它检查对BLOB的ETag属性 - 允许使用通配符,因此,我们希望只允许上传,如果用这个名字没有斑点有任何ETAG(这是迂回的说法,这个blob名字是否存在)。

您将得到一个StorageException,如下所述。

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

您还可以检查是否存在斑点,然后上传,像这样:

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

如果你没有一个已存在的方法,看看这个答案Checking if a blob exists in Azure Storage

+4

据我了解,这可能不是,如果你有多个客户端访问容器的工作 - 为斑点可能是由不同的线程/系统/客户端该线程的'之间创建存在'和上传语句。在许多客户端环境中使用Exists解决方案之前,您可能需要测试此场景。 – 2013-06-07 21:30:40

4

Rob Church提供的答案似乎没问题。检查字符串错误是不是最好的做法,并加以改进:

 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

天青现在有一个接入条件只会增加,不会覆盖:AccessCondition.GenerateIfNotExistsCondition()

定义:

的构建访问条件,以便仅在资源不存在时才会执行操作。

例子:

var accessCondition = AccessCondition.GenerateIfNotExistsCondition(); 
blockBlob.UploadFromStream(stream, accessCondition); 
相关问题