Rackspace の Cloud Files に数千のブロブがあり、コンテンツ タイプを更新する必要があります。ただし、jclouds API を使用してそれを行う方法がわかりません。
既存の BLOB のメタデータを更新するにはどうすればよいですか?
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"
これを回避するには、APIのドキュメントcopy
で説明されているように、操作を使用して blob をそれ自体にコピーします。
同じオブジェクトにコピーすることにより、POST 操作の代わりに COPY を使用できます。
これは、次のようにベンダー/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);