Я использую Apache JClouds для подключения к своей установке Openstack Swift. Мне удалось загружать и скачивать объекты из Swift. Однако мне не удалось увидеть, как загрузить динамический большой объект в Swift.
Чтобы загрузить динамический большой объект, мне нужно сначала загрузить все сегменты, что я могу сделать как обычно. Затем мне нужно загрузить объект манифеста, чтобы логически объединить их. Проблема в том, чтобы сообщить Swift, что это объект манифеста, мне нужно установить специальный заголовок, который я не знаю, как это сделать с помощью API JClouds.
Вот пример динамического большого объекта с официального сайта openstack.
Код, который я использую:
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"
}
}
Часть "TODO" - моя проблема.
Отредактировано:
Мне указали, что Jclouds автоматически обрабатывает загрузку больших файлов, что не так полезно в нашем случае. На самом деле, мы не знаем, насколько большим будет файл или когда прибудет следующий сегмент, когда мы начинаем загружать первый сегмент. Наш API предназначен для того, чтобы клиент мог загружать свои файлы фрагментами выбранного им размера и в выбранное им время, а когда это было сделано, вызывать «коммит», чтобы сделать эти фрагменты файлом. Так что это заставляет нас захотеть загрузить манифест самостоятельно здесь.