Azure blobs Java sdk 无法返回对象的 versionID 列表

Posted

技术标签:

【中文标题】Azure blobs Java sdk 无法返回对象的 versionID 列表【英文标题】:Azure blobs Java sdk can not return the list of versionIDs of an object 【发布时间】:2021-07-16 18:11:22 【问题描述】:

我正在尝试通过 Java SDK 版本 12.10.2 获取 Azure blob 的 versionID 列表,但它只返回带有以下错误消息的 HTTP 错误 400

com.azure.storage.blob.models.BlobStorageException: Status code 400, "<?xml version="1.0" encoding="utf-8"?><Error><Code>InvalidQueryParameterValue</Code><Message>Value for one of the query parameters specified in the request URI is invalid.
RequestId:bd7e9a20-401e-003e-6d7b-37d0dd000000
Time:2021-04-22T13:29:12.0965760Z</Message><QueryParameterName>include</QueryParameterName><QueryParameterValue>versions</QueryParameterValue><Reason>Invalid query parameter value.</Reason></Error>"

还有,这是我的 Java 代码:

public static BlobContainerAsyncClient getAzureAsyncClient(String accountName, String accountKey, String endpoint) 
        String connectionString = getConnectionString(accountName, accountKey, endpoint);
        BlobContainerAsyncClient blobServiceClient = new BlobContainerClientBuilder()
          .connectionString(connectionString)
          .serviceVersion(version)
                  .buildAsyncClient();
    RWLog.MAIN.info("Azure Storage Async Service Client created for " + accountName);    
        return blobServiceClient;


BlobContainerAsyncClient containerClient = AzureConnection.getAzureAsyncClient(folder.getBucket(), folder.getSecretKey(), folder.getEndpoint());
    ListBlobsOptions ops = new ListBlobsOptions();
    ops.getDetails().setRetrieveVersions(true);
    ops.setPrefix(blobKey);
    PagedFlux<BlobItem> list =
        containerClient.listBlobsByHierarchy("/", ops);

Java SDK 构建的 HTTP 请求似乎无法被 Azure blobs 服务器识别。服务器端无法处理来自 Java 客户端的包含版本的查询。 有什么想法吗?

【问题讨论】:

您使用的是什么版本的 Java SDK? 我使用的是 azure-storage-blob 的 12.10.2 【参考方案1】:

只需使用 azure-storage-blob 的 12.10.2 尝试此操作即可获取所有版本的 blob:

public static void main(String[] args) 

                String connString = "";
                String containerName = "";
                String blobName = "";

                BlobServiceClient client = new BlobServiceClientBuilder().connectionString(connString).buildClient();

                BlobContainerClient blobContainerClient = client.getBlobContainerClient(containerName);
                ListBlobsOptions options = new ListBlobsOptions().setPrefix(blobName)
                                .setDetails(new BlobListDetails().setRetrieveVersions(true));

                Iterator<BlobItem> it = blobContainerClient.listBlobs(options, null).iterator();
                while (it.hasNext()) 
                        BlobItem item = it.next();
                        System.out.println(" versionID: " + item.getVersionId());
                

        

结果:

【讨论】:

以上是关于Azure blobs Java sdk 无法返回对象的 versionID 列表的主要内容,如果未能解决你的问题,请参考以下文章

未从 blob 上的 azure java sdk 收到元数据字段

使用 Azure Java SDK V12 和 ListBlobs() 在 Azure Blobstorage 中列出 Blob 非常慢

在 Java SDK 中模拟 Azure 存储 Blob

Blob 存储 java sdk 由 azure AD 授权

适用于 blob 的 Azure Java SDK - 已请求加载默认 HttpClient 提供程序,但在类路径中找不到该提供程序

VS2015 无法安装包 Azure.Storage.Blobs.12.5.1