我使用Apache JClouds连接到我的Openstack Swift安装。我设法从Swift上传和下载对象。但是,我没有看到如何将动态大对象上传到Swift。
要上传动态大对象,我需要先上传所有段,我可以照常上传。然后我需要上传一个清单对象来逻辑地组合它们。问题是告诉Swift这是一个清单对象,我需要设置一个特殊的标题,我不知道如何使用JClouds api做到这一点。
这是来自openstack官方网站的动态大型对象example。
我使用的代码:
public static void main(String[] args) throws IOException {
BlobStore blobStore = ContextBuilder.newBuilder("swift").endpoint("http://localhost:8080/auth/v1.0")
.credentials("test:test", "test").buildView(BlobStoreContext.class).getBlobStore();
blobStore.createContainerInLocation(null, "container");
ByteSource segment1 = ByteSource.wrap("foo".getBytes(Charsets.UTF_8));
Blob seg1Blob = blobStore.blobBuilder("/foo/bar/1").payload(segment1).contentLength(segment1.size()).build();
System.out.println(blobStore.putBlob("container", seg1Blob));
ByteSource segment2 = ByteSource.wrap("bar".getBytes(Charsets.UTF_8));
Blob seg2Blob = blobStore.blobBuilder("/foo/bar/2").payload(segment2).contentLength(segment2.size()).build();
System.out.println(blobStore.putBlob("container", seg2Blob));
ByteSource manifest = ByteSource.wrap("".getBytes(Charsets.UTF_8));
// TODO: set manifest header here
Blob manifestBlob = blobStore.blobBuilder("/foo/bar").payload(manifest).contentLength(manifest.size()).build();
System.out.println(blobStore.putBlob("container", manifestBlob));
Blob dloBlob = blobStore.getBlob("container", "/foo/bar");
InputStream input = dloBlob.getPayload().openStream();
while (true) {
int i = input.read();
if (i < 0) {
break;
}
System.out.print((char) i); // should print "foobar"
}
}
&#34; TODO&#34;部分是我的问题。
编辑:
我已经指出Jclouds会自动处理大文件上传,这在我们的案例中并不是那么有用。实际上,我们不知道文件的大小,或者在我们开始上传第一个段时下一个段何时到达。我们的api旨在让客户能够在他们自己选择的时间内以他们自己选择的大小上传他们的文件,并且在完成后,请致电&#39; commit&#39;将这些块作为文件。所以这使我们想要在这里自己上传清单。
答案 0 :(得分:2)
根据@Everett Toews的回答,我的代码运行正常:
public static void main(String[] args) throws IOException {
CommonSwiftClient swift = ContextBuilder.newBuilder("swift").endpoint("http://localhost:8080/auth/v1.0")
.credentials("test:test", "test").buildApi(CommonSwiftClient.class);
SwiftObject segment1 = swift.newSwiftObject();
segment1.getInfo().setName("foo/bar/1");
segment1.setPayload("foo");
swift.putObject("container", segment1);
SwiftObject segment2 = swift.newSwiftObject();
segment2.getInfo().setName("foo/bar/2");
segment2.setPayload("bar");
swift.putObject("container", segment2);
swift.putObjectManifest("container", "foo/bar2");
SwiftObject dlo = swift.getObject("container", "foo/bar", GetOptions.NONE);
InputStream input = dlo.getPayload().openStream();
while (true) {
int i = input.read();
if (i < 0) {
break;
}
System.out.print((char) i);
}
}
答案 1 :(得分:1)
jclouds处理为你写清单。以下是一些可能对您有帮助的示例,UploadLargeObject和largeblob.MainApp。
答案 2 :(得分:0)
尝试使用
Map<String, String> manifestMetadata = ImmutableMap.of(
"X-Object-Manifest", "<container>/<prefix>");
BlobBuilder.userMetadata(manifestMetadata)
如果这不起作用,您可能必须使用CrossOriginResourceSharingContainer.java中的CommonSwiftClient。