У меня есть куча файлов в корзине S3.Мне нужно просмотреть их и добавить некоторые метаданные, для которых я использую клиент узла .API S3 не делает это так просто, как хотелось бы.Из документов :
Обратите внимание, что если вы решите обновить какие-либо метаданные, настраиваемые пользователем (системные или пользовательские) объекта во время копирования, то вы должны явно указатьвсе настраиваемые пользователем метаданные, присутствующие в исходном объекте в вашем запросе, даже если вы изменяете только одно из значений метаданных.
Хорошо, но это работает, только если у вас есть полный списокметаданных, которые может иметь объект 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
, но это имеет аналогичную проблему, так как я не знаю, какие другие метаданные только для чтения они могут ввести в будущем.По крайней мере, мне не нужно знать все существующие элементы метаданных.
Или если есть альтернативный подход к этому, это было бы хорошо.Надеюсь, кто-то придумал более разумный способ справиться с этим.