在Azure存储中检查blob是否存在

158

我有一个非常简单的问题(希望如此!)- 我想找出是否在特定容器中存在一个由我定义名称的 blob。 如果它存在,我将下载它,如果不存在,我将执行其他操作。

我在互联网上进行了一些搜索,显然曾经有一个名为 DoesExist 或类似名称的函数...但是就像许多 Azure API 一样,它似乎已经消失了(或者如果存在,那它有一个非常巧妙的伪装名称)。


1
谢谢大家。由于我正在使用StorageClient(并且希望所有的Azure存储访问都通过该库进行),所以我选择了smarx建议的FetchAttributes-and-check-for-exceptions方法。这种方法在某种程度上感觉有些不对,因为我不喜欢将异常作为业务逻辑的正常部分抛出 - 但希望这可以在未来的StorageClient版本中得到修复 :) - John
13个回答

2

虽然这里的大多数答案在技术上是正确的,但大多数代码示例都是使用同步/阻塞调用的。除非您受到非常老的平台或代码库的限制,否则应该始终异步执行HTTP调用,并且在这种情况下,SDK完全支持它。只需使用ExistsAsync()而不是Exists()即可。

bool exists = await client.GetContainerReference(containerName)
    .GetBlockBlobReference(key)
    .ExistsAsync();

1
你是正确的,旧的.Exists() 不是最佳选择。然而,虽然旧的 API 是同步的,但使用_await_ 导致 ExistsAsync 也变为同步。所以,我同意 HTTP 调用通常应该是异步的。但这段代码并非如此。尽管如此,新的 API 值得 +1! - Richard
3
谢谢,但我非常不同意。 Exists()是同步的,因为它会阻塞线程直到完成。 await ExistsAsync()是异步的,因为它不会这样做。两者都遵循相同的“逻辑”流程,即下一行代码在前一行完成后才开始,但正是ExistsAsync的非阻塞性使其成为异步。 - Todd Menier
2
还有...我学到了新东西! :) https://softwareengineering.stackexchange.com/a/183583/38547 - Richard

2

2

使用新的v12 SDK的Java版本

这使用共享密钥凭据授权(帐户访问密钥)

public void downloadBlobIfExists(String accountName, String accountKey, String containerName, String blobName) {
    // create a storage client using creds
    StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
    String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net", accountName);
    BlobServiceClient storageClient = new BlobServiceClientBuilder().credential(credential).endpoint(endpoint).buildClient();

    BlobContainerClient container = storageClient.getBlobContainerClient(containerName);
    BlobClient blob = container.getBlobClient(blobName);
    if (blob.exists()) {
        // download blob
    } else {
        // do something else
    }
}

1
这只是检测容器是否存在的测试。 - Capuchin
@Capuchin 谢谢你指出这个问题。我似乎把我的答案贴在了错误的问题上。我已经更新了答案,请看一下。 - Somansh Reddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接