我正在尝试通过执行完全相同的密钥但使用新元数据的副本来在s3存储中的所有现有文件上设置缓存控制标头。 s3 api通过x-amz-metadata-directive: REPLACE
标题支持此功能。在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标头被丢弃了吗?
答案 0 :(得分:2)
根据最新的ATMOS Programmer's Guide版本2.3.0,表11和12,没有指定对象的COPY不受支持或支持。
我一直在使用ATMOS已经有一段时间了,我相信S3复制功能在某种程度上是使用ATMOS对象版本控制在内部转换为一系列命令(第76页)。因此,他们可能会将Amazon复制操作转换为“创建版本”,然后“删除或截断旧的引用对象”。也许我完全错了(因为我不为EMC工作:-))并且他们以不同的方式处理它......但是,这就是我通过阅读原生ATMOS API的文档看到的。
你可以尝试做什么: 使用本机ATMOS API(这有点痛苦,是的,我知道),然后,创建原始对象的版本(页面76),更新此类版本的元数据(用户元数据,页面12),然后还原顶级对象的版本(第131页)。之后,检查是否在S3 API中正确返回元数据。
那是我的2美分。如果您决定尝试这样的解决方案,请在此处发布,如果可行的话。