AWS S3 headObject 不返回 JS SDK 中的所有元数据值
AWS S3 headObject not returning all metadata values in JS SDK
我在 AWS S3 存储桶中有一个 object,上面设置了一些元数据键。我使用 AWS v2 JavaScript SDK 中的 headObject()
获取键和值。
const headParams = {
Bucket: "THE_BUCKET",
Key: "THE_KEY"
};
S3.headObject(headParams, (err, data) => {
if(err) {
console.log(err);
} else {
console.log(data);
}
});
如果我然后使用 copyObject()
:
通过按键“修改”其中一个
objectMetadata["SOME_EXISTING_METADATA_KEY"] = "Some New Value";
const params = {
Bucket: "THE_BUCKET",
Key: "THE_KEY",
CopySource: "THE_BUCKET/THE_KEY",
MetadataDirective: "REPLACE",
ACL: "public-read",
'Metadata': objectMetadata
};
S3.copyObject(params, (err, data) => {
if(err) {
console.log(err);
} else {
console.log(data);
}
});
然后再次调用 headObject()
,我得到了预期的更新值。
如果我使用上面相同的 copyObject()
代码,但尝试添加 object 上尚不存在的新元数据键:
...
objectMetadata["SOME_NEW_METADATA_KEY"] = "Some New Value";
...
我在 S3 控制台中看到了新值,但是当我再次调用 headObject()
时,新的元数据键没有出现。
然而,LastModified
header 中的时间戳显示 object 在我添加新密钥时已被修改。而且,如果我使用 AWS CLI 检索相同 object 的元数据,则会出现新密钥:
aws s3api head-object --bucket THE_BUCKET --key THE_KEY
{
"AcceptRanges": "bytes",
"LastModified": "2021-05-03T19:06:14+00:00",
"ContentLength": 18340648,
"ETag": "\"a8...\"",
"ContentType": "application/octet-stream; charset=UTF-8",
"Metadata": {
...
"SOME_NEW_METADATA_KEY": "Some New Value",
...
}
}
有人以前见过这种行为吗?我不明白为什么密钥会出现在控制台和 CLI 的结果中,而不是 JavaScript SDK。特别是因为 SDK 显示了更新现有密钥的结果。
我的一位同事能够追踪到这一点。万一其他人遇到这个问题,原来是 CORS 配置问题*。
每个元数据键都需要明确添加为 ExposeHeader entry in the CORS configuration。
这是 CORS 配置中的相关部分,您可以在 S3 的“权限”选项卡下的“跨域资源共享”部分进行编辑:
"ExposeHeaders": [
...
"SOME_EXISTING_METADATA_KEY",
"SOME_NEW_METADATA_KEY"
]
* 早该知道了。正如我祖父喜欢说的那样,“当网络上的某些东西不能正常工作时,它可能是 CORS 问题。”
我在 AWS S3 存储桶中有一个 object,上面设置了一些元数据键。我使用 AWS v2 JavaScript SDK 中的 headObject()
获取键和值。
const headParams = {
Bucket: "THE_BUCKET",
Key: "THE_KEY"
};
S3.headObject(headParams, (err, data) => {
if(err) {
console.log(err);
} else {
console.log(data);
}
});
如果我然后使用 copyObject()
:
objectMetadata["SOME_EXISTING_METADATA_KEY"] = "Some New Value";
const params = {
Bucket: "THE_BUCKET",
Key: "THE_KEY",
CopySource: "THE_BUCKET/THE_KEY",
MetadataDirective: "REPLACE",
ACL: "public-read",
'Metadata': objectMetadata
};
S3.copyObject(params, (err, data) => {
if(err) {
console.log(err);
} else {
console.log(data);
}
});
然后再次调用 headObject()
,我得到了预期的更新值。
如果我使用上面相同的 copyObject()
代码,但尝试添加 object 上尚不存在的新元数据键:
...
objectMetadata["SOME_NEW_METADATA_KEY"] = "Some New Value";
...
我在 S3 控制台中看到了新值,但是当我再次调用 headObject()
时,新的元数据键没有出现。
然而,LastModified
header 中的时间戳显示 object 在我添加新密钥时已被修改。而且,如果我使用 AWS CLI 检索相同 object 的元数据,则会出现新密钥:
aws s3api head-object --bucket THE_BUCKET --key THE_KEY
{
"AcceptRanges": "bytes",
"LastModified": "2021-05-03T19:06:14+00:00",
"ContentLength": 18340648,
"ETag": "\"a8...\"",
"ContentType": "application/octet-stream; charset=UTF-8",
"Metadata": {
...
"SOME_NEW_METADATA_KEY": "Some New Value",
...
}
}
有人以前见过这种行为吗?我不明白为什么密钥会出现在控制台和 CLI 的结果中,而不是 JavaScript SDK。特别是因为 SDK 显示了更新现有密钥的结果。
我的一位同事能够追踪到这一点。万一其他人遇到这个问题,原来是 CORS 配置问题*。
每个元数据键都需要明确添加为 ExposeHeader entry in the CORS configuration。
这是 CORS 配置中的相关部分,您可以在 S3 的“权限”选项卡下的“跨域资源共享”部分进行编辑:
"ExposeHeaders": [
...
"SOME_EXISTING_METADATA_KEY",
"SOME_NEW_METADATA_KEY"
]
* 早该知道了。正如我祖父喜欢说的那样,“当网络上的某些东西不能正常工作时,它可能是 CORS 问题。”