amazon-s3 - 是否有完整的 S3 对象元数据列表?
问题描述
我在 S3 存储桶中有一堆文件。我需要浏览它们并添加一些元数据,为此我使用节点客户端。S3 api 并不像您希望的那样简单。从文档:
请注意,如果您选择在复制期间更新任何对象的用户可配置元数据(系统或用户定义的),那么您必须在请求中明确指定源对象上存在的所有用户可配置元数据,即使您仅更改元数据值之一。
很好,但这只有在您拥有 S3 对象可以拥有的完整元数据列表时才有效。我找到了这个列表,但它并不完整。例如,它不包含ContentType
. 如果我用尽可能多的东西加载一个对象,我会得到这个:
aws s3api head-object --bucket my-bucket --key some-file
{
"AcceptRanges": "bytes",
"ContentType": "video/mp4",
"LastModified": "Sat, 18 May 2019 18:18:50 GMT",
"ContentLength": 50957711,
"VersionId": "null",
"ETag": "\"2d8a6acea8c37217a034d841084c6727-4\"",
"StorageClass": "ONEZONE_IA",
"ServerSideEncryption": "aws:kms",
"CacheControl": "cc",
"SSEKMSKeyId": "arn:aws:kms:us-east-1:999999999999:key/99999999-9999-9999-9999-999999999999",
"Metadata": {
"val1": "test1",
"val2": "test2"
}
}
这是整个名单吗?我不知道,也找不到任何文档。如果 aws 决定稍后添加更多系统元数据,会发生什么情况?
我还尝试像这样复制现有的头部:
const p1 = { Bucket: bucket, Key: obj.Key, CopySource: `${bucket}/${obj.Key}`, MetadataDirective: 'REPLACE' };
const p2 = Object.assign(p1, head, { Metadata: { prop1: 'val1' } });
await s3.copyObject(p2).promise();
这导致了这样的错误:
- UnexpectedParameter:在参数中找到意外的键“ContentLength”
因为某些系统元数据是只读的。我可以简单地做到这一点
delete p2.ContentLength
但这有一个类似的问题,因为我不知道他们将来可能会引入哪些其他只读元数据。至少我不必知道所有现有的元数据项。
或者,如果有另一种方法可以做到这一点,那就没问题了。希望有人想出了一个更合理的方法来处理这个问题。
解决方案
推荐阅读
- python - 使用两个数据框计算多个点的半正弦最近距离
- vue.js - 在 Nuxt 页面上从 JobAdder 加载添加
- mongodb - Mongodb 继续以 abort trap 6 终止
- python - Python BeautifulSoup 用过滤器抓取网站
- json - \n 在 vscode 编辑器中不显示为换行符
- css - 从同一个非根目录导入css文件
- r - 根据r中的另一个数据框匹配和添加数据
- reactjs - Create-React-App 网络 url 随机停止工作?
- javascript - 如何使用react useState添加数组的用户输入对象,当我在字段中键入并发送它时,它不会更新问题
- sql-insert - 多个 INSERT INTO 到单行