我试图在使用 jclouds 将我的对象上传到我的 Swift 环期间设置对象过期,以便在指定的日期/时间从 Swift 中删除这些对象。
我可以使用 cURL 手动执行此操作,并将具有到期日期的对象放入 Swift。这利用了X-Delete-At或X-Delete-After标头。有关这些标头的详细信息,请参阅openstack docs 1和openstack 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标头。
任何帮助表示赞赏。谢谢!