jclouds:如何更新现有 blob 的元数据?

Posted

技术标签:

【中文标题】jclouds:如何更新现有 blob 的元数据?【英文标题】:jclouds : how do I update metadata for an existing blob? 【发布时间】:2014-04-03 17:49:29 【问题描述】:

我在 Rackspace 的云文件中有几千个 blob,我需要为其更新内容类型。但是,我不知道如何使用 jclouds API 做到这一点。

如何更新现有 Blob 上的元数据?

【问题讨论】:

【参考方案1】:

假设您已经为您的机架空间运行了整个设置,那么使用 jclouds 很容易:

首先使用以下详细信息进行初始化:

    BlobStoreContext context = ContextBuilder.newBuilder(provider)
            .credentials(username, apiKey)
            .buildView(BlobStoreContext.class);

    BlobStore blobStore = context.getBlobStore();

您现在可以构建一个新的 blob 以放入机架空间:

Blob blob = blobStore.blobBuilder(key) .userMetadata(元数据) .有效载荷(值) .build();

blobStore.putBlob(container, blob);

value 是输入字节[],元数据是与 blob 类似内容类型关联的元数据的哈希映射。

如果你想做更新之类的操作:

RegionScopedBlobStoreContext context = ContextBuilder.newBuilder("openstack-swift")
                                .endpoint(config.getAuthUrl())
                                .credentials(config.getUser(), config.getPasswd())
                                .overrides(p)
                                .buildView(RegionScopedBlobStoreContext.class);
SwiftApi swift = (SwiftApi) ((org.jclouds.rest.internal.ApiContextImpl)context.unwrap()).getApi();

boolean success = swift.objectApiInRegionForContainer(config.getRegion(), container).updateMetadata(filename, metaData);

我知道这是一个概述,但我希望它能给你一个好的方向。

【讨论】:

【参考方案2】:

从 jclouds 2.1.0(和至少 1.9.3)开始,更改对象 custom 元数据的 API 如下所示:

BlobStoreContext context = contextBuilder.buildView(BlobStoreContext.class);
SwiftApi api = (SwiftApi) ((org.jclouds.rest.internal.ApiContextImpl)context.unwrap()).getApi();
ObjectApi objectApi = api.getObjectApi(region, container);
Map<String, String> meta = new HashMap<>();
meta.put('some-meta', value);
objectApi.updateMetadata(blobName, meta);

无法通过这种方式更新内容类型,只能更新键以X-Object-Meta- 开头的元数据。 updateMetadata 自动为传递给它的所有键添加前缀X-Object-Meta-。在上面的示例中,带有键 X-Object-Meta-some-meta 的自定义数据将被添加到 blob。

理论上updateRawMetadata 应该能够更新内容类型(它不会在键中添加X-Object-Meta- 前缀并逐字传递它们)但是由于 jclouds 中的错误,它对于内容类型键失败并出现错误:

configuration error please use request.getPayload().getContentMetadata().setContentType(value) as opposed to adding a content type header

我通过 curl 检查了更新内容类型,它工作正常,所以这是 jclouds 中的一个错误:

curl -X POST -H "X-Auth-Token: $TOKEN" -H "Content-Type: $CONTENT_TYPE"  "$PUBLIC_URL/$CONTAINER/$BLOB_NAME"

解决方法是使用copy 操作将 blob 复制到自身中,如 API 的documentation 中所述:

您可以通过复制到同一个对象来使用 COPY 作为 POST 操作的替代方法

这可以使用供应商/api 独立的 jclouds API 来完成,如下所示:

Blob blob = blobStore.getBlob(container, blobName);
MutableContentMetadata contentMetadata = blob.getPayload().getContentMetadata();
contentMetadata.setContentType(mimeType);
blobStore.copyBlob(getContainer, blobName, getContainer, blobName,
       CopyOptions.builder().contentMetadata(contentMetadata).build());

或通过SwiftApi(这不需要获取 blob 的元数据):

BlobStoreContext context = contextBuilder.buildView(BlobStoreContext.class);
SwiftApi api = (SwiftApi) ((org.jclouds.rest.internal.ApiContextImpl)context.unwrap()).getApi();
ObjectApi objectApi = api.getObjectApi(region, container);
Map<String, String> meta = new HashMap<>();
meta.put(HttpHeaders.CONTENT_TYPE, mimeType);
objectApi.copy(blobName, container, blobName, new HashMap<String, String>(), meta);

【讨论】:

以上是关于jclouds:如何更新现有 blob 的元数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 Azure.Storage.Blob 中的元数据

Boto3 S3 更新现有对象的元数据

OpenStack Swift 多部分上传 jclouds

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回

如何通过 python 将 JSON 数据附加到存储在 Azure blob 存储中的现有 JSON 文件?

如何将 blob 上传到 C# 函数中的现有容器