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

时间:2014-03-02 21:42:43

标签: metadata blob jclouds

我在Rackspace的Cloud Files中有几千个blob,我需要更新内容类型。但是,我无法弄清楚如何使用jclouds API。

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

2 个答案:

答案 0 :(得分:3)

假设您已经为机架空间运行了整个设置,使用jclouds非常简单:

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

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

    BlobStore blobStore = context.getBlobStore();

您现在可以构建一个新的blob来放置rackspace:

  

blob blob = blobStore.blobBuilder(key)                               .userMetadata(元数据)                               .payload(值)                               .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);

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

答案 1 :(得分:1)

从jclouds 2.1.0(至少1.9.3)开始,用于更改对象自定义元数据的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操作的替代方法

这可以使用像这样的vendor / 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);