1

我试图在使用 jclouds 将我的对象上传到我的 Swift 环期间设置对象过期,以便在指定的日期/时间从 Swift 中删除这些对象。

我可以使用 cURL 手动执行此操作,并将具有到期日期的对象放入 Swift。这利用了X-Delete-AtX-Delete-After标头。有关这些标头的详细信息,请参阅openstack docs 1openstack docs 2

但是,我没有任何运气通过 jclouds 做同样的事情。通过 jclouds 快速搜索并没有找到任何一个 X-Delete- 标头,所以我的假设是不直接支持,除非在消息有效负载中手动设置这些标头。

澄清一点:这些标头不能设置为对象用户元数据。例如,在对象上设置X-Delete-At的用户元数据键将导致X-Object-Meta-x-delete-at形式的标题,swift 不会将其识别为对象过期。

我试图弄清楚是否有一种方法可以将自定义标头添加到 HTTP PUT 操作(不是用户元数据)来执行此操作。使用 cURL,就像添加一样简单:

-H "X-Delete-After:60"

to the cURL command for the PUT operation (i.e., expire the object in 60 seconds). I assume the same can be done with jclouds. This is what I have so far:

public String writeToStore(String name, InputStream payload) {

    BlobStore bs = prepareContext().
            getBlobStore();

    Blob b = bs.
            blobBuilder(name).
            // userMetadata(mymeta).
            payload(payload).
            contentType("image/jpeg").
            build();

    // Get current headers
    Multimap<String,String> headers = b.getAllHeaders();
    // Add new header & set expire date to 1 year in the future (seconds since epoch)
    headers.put("X-Delete-At", "1418148027");
    // Set headers including new header just added
    b.setAllHeaders(headers);

    return bs.putBlob(containerName, b);
}

尽管在此处添加了X-Delete-At标头,但它似乎没有效果。我在数据包的 Wireshark 捕获中根本没有看到X-Delete-At标头。

任何帮助表示赞赏。谢谢!

4

1 回答 1

1

jclouds 目前不支持这一点,但我提出了一个将 BlobBuilder.expires 映射到 X-Delete-At 的提交:

https://github.com/jclouds/jclouds/pull/227

你可以测试它并在这里打开一个 JIRA 问题:

https://issues.apache.org/jira/browse/JCLOUDS

谢谢!

于 2013-12-10T06:29:27.913 回答