java - 如何在 Apache JClouds 中设置 HTTP header ?

标签 java openstack-swift jclouds

我正在使用 Apache JClouds 连接到我的 Openstack Swift 安装。我成功地从 Swift 上传和下载对象。但是,我没能看到如何将动态大对象上传到 Swift。

要上传动态大对象,我需要先上传所有片段,我可以照常这样做。然后我需要上传一个 list 对象以将它们逻辑地组合起来。问题是告诉 Swift 这是一个 list 对象,我需要设置一个特殊的 header ,但我不知道如何使用 JClouds api 来做到这一点。

这是一个动态大对象example来自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 旨在使客户端能够在自己选择的时间以自己选择的大小块上传文件,完成后调用“提交”将这些 block 作为文件。所以这让我们想在这里自己上传 list 。

最佳答案

根据 @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);
    }
}

关于java - 如何在 Apache JClouds 中设置 HTTP header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22853557/

相关文章:

java - 如何读取HTTP POST请求参数

java - 将安全组添加到 Openstack 中的实例

java - 为什么与 jclouds 一起使用的 CloudWatch API getMetricStatisticsInRegion 会抛出 UndeclaredThrowableException?

python - 是否可以使用 python 脚本(或任何其他编程语言脚本)来限制其他应用程序使用的资源(如 RAM、CPU 使用率)?

java - "HTTP method DELETE doesn' 使用 jClouds 在 Swift 上执行批量删除时,t 支持输出“异常

java - 如何检测Android中的上传/下载传输速率?

java - spring ntlmV2 不支持

java - Android Studio GridView

java - Spark中通过SWIFT从对象存储获取数据需要什么配置