2

我正在尝试通过执行复制到完全相同的密钥但使用新元数据来在 s3 存储中的所有现有文件上设置缓存控制标头。s3 api 通过x-amz-metadata-directive: REPLACEHeader 支持这一点。在https://docs.developer.swisscom.com/service-offerings/dynamic.html#s3-api的 s3 api 兼容性文档中,对象复制方法既未列为受支持也未列为受支持。

副本本身可以正常工作(到另一个键),但是设置新元数据的选项似乎不适用于复制到相同或不同的键。ATMOS s3 兼容的 API 是否不支持这一点和/或是否有任何其他方式来更新元数据而无需读取所有内容并将其写回存储?

我目前正在使用 Amazon Java SDK (v. 1.10.75.1) 进行调用。

更新:

经过更多测试后,我遇到的问题似乎更加具体。该副本有效,我可以成功更改其他元数据,例如 Content-Disposition 或 Content-Type。只是 Cache-Control 被忽略。

这里要求的是我用来拨打电话的代码:

BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, sharedsecret);
AmazonS3 amazonS3 = new AmazonS3Client(awsCreds);
amazonS3.setEndpoint(endPoint);

ObjectMetadata metadata = amazonS3.getObjectMetadata(bucketName, storageKey).clone();
metadata.setCacheControl("private, max-age=31536000");
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucketName, storageKey, bucketName, storageKey).withNewObjectMetadata(metadata);
amazonS3.copyObject(copyObjectRequest);

也许对 API 的 PUT(复制)请求上的 Cache-Control 标头在途中被丢弃了?

4

1 回答 1

2

根据最新的 ATMOS 程序员指南,版本 2.3.0,表 11 和 12,没有指定对象的 COPY 不受支持或支持。

我使用 ATMOS 已经有一段时间了,我相信 S3 复制功能在内部以某种方式使用 ATMOS 对象版本控制转换为一系列命令(第 76 页)。因此,他们可能会将亚马逊复制操作转换为“创建版本”,然后“删除或截断旧的引用对象”。也许我完全错了(因为我不为 EMC 工作:-))并且他们以不同的方式处理它......但是,这就是我通过阅读本机 ATMOS API 的文档所看到的。

您可以尝试做什么:使用本机 ATMOS API(这有点痛苦,是的,我知道),然后,创建原始对象的版本(第 76 页),更新该版本的元数据(用户元数据,第 12 页),然后将版本恢复到顶级对象(第 131 页)。之后,检查元数据是否会在 S3 API 中正确返回。

那是我的2美分。如果您决定尝试这样的解决方案,如果可行,请在此处发布。

于 2016-10-28T00:04:26.647 回答