首页 > 解决方案 > 是否有完整的 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

但这有一个类似的问题,因为我不知道他们将来可能会引入哪些其他只读元数据。至少我不必知道所有现有的元数据项。

或者,如果有另一种方法可以做到这一点,那就没问题了。希望有人想出了一个更合理的方法来处理这个问题。

标签: amazon-s3metadata

解决方案


推荐阅读