amazon-s3 - 具有新元数据的 S3 复制对象

标签 amazon-s3 swisscomdev

我试图通过执行完全相同的 key 但使用新元数据的副本来在 s3 存储中的所有现有文件上设置缓存控制 header 。 s3 api 通过 x-amz-metadata-directive: REPLACE header 支持此功能。在 s3 api 兼容性文档中 https://docs.developer.swisscom.com/service-offerings/dynamic.html#s3-api对象复制方法既未列为支持或不支持。

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

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

更新:

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

根据此处的要求,我用于调用电话的代码:

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 header 在途中的某个地方被丢弃?

最佳答案

根据最新ATMOS Programmer's Guide ,版本 2.3.0,表 11 和 12,没有指定不支持或支持对象的 COPY。

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

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

这是我的 2 美分。如果您决定尝试这样的解决方案,如果有效的话,请将其发布到此处。

关于amazon-s3 - 具有新元数据的 S3 复制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40287304/

相关文章:

python - 如何通过 Boto3 检查现有 key 的存储类?

docker - 如何从 Cloud Foundry 上的私有(private)存储库部署 Docker 镜像?

docker - 如何为 Swisscom elasticsearch 公共(public)云 (CloudFoundry) 配置 Kibana

mysql - 为什么我不能将带有触发器的 mysql 转储导入 mariadb

php - Amazon 通过 API 将文件从 S3 移动到 Glacier

python - 如何访问 scrapy 上传到 S3 的图像名称?

javascript - 播放 s3 音频并在 React 组件中下载文件

python - 使用 boto,在 s3 上已经存在的文件上设置 content_type

Swisscom Cloud 上的 Java 应用程序因 OOM 失败

cloud-foundry - Swisscom 应用程序云上的 Grafana 停止运行