我在Rackspace的Cloud Files中有几千个blob,我需要更新内容类型。但是,我无法弄清楚如何使用jclouds API。
如何更新现有blob的元数据?
答案 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);