node.js - 如何在使用 Node.js 开发工具包创建预签名 URL 时更新/定义 AWS S3 对象的系统元数据
问题描述
我目前正在生成一个预签名的 url 以将对象上传到我的 AWS s3 存储桶
const signedUrl = await s3.getSignedUrl('putObject', params);
这是我的参数对象:
const params = {
Bucket: 'mybucket',
Key: `mybucketpost-${Math.ceil(Math.random() * 10 ** 10)}.png`,
ContentType: 'image/png',
Metadata: {
ContentType: 'image/png',
},
Expires: 36000
}
我能够成功生成预签名 URL 并将对象上传到我的存储桶,但是当我尝试使用该s3.getSignedUrl
方法访问对象时,会下载对象而不是在我的浏览器选项卡中打开 png 图像。现在通过我所做的所有研究,我明白为什么会发生这种情况。那是因为Content-Type
我的对象的系统定义对象元数据仍然是binary/octet-stream
. 即使我尝试更改我正在为 to 生成预签名 url 的对象的 Content-Type image/png
,它也会被添加为 object 的用户生成的元数据x-amz-meta-contenttype: image/png
。
所以在我的 AWS 控制台中,我上传的对象的元数据是:
System defined Cache-Control no-cache
System defined Content-Type binary/octet-stream
User defined x-amz-meta-contenttype image/png
不幸的是,这并不能解决在浏览器选项卡中加载图像的问题。Content-Type
我已尝试直接通过 AWS 控制台将对象的系统定义元数据更改为,image/png
并且如预期的那样,对象 (png) 使用对象 URL 在我的浏览器选项卡中打开,但我无法找到使用适用于 Node.js 的 AWS 开发工具包更改系统定义的元数据Content-Type
的方法,同时使用该putObject
属性生成预签名 URL。需要你的帮助。谢谢!
解决方案
当我在上传到 S3 时尝试设置 Content-Disposition 元数据时遇到了同样的问题。就我而言,通过删除Metadata
params 中的对象对我有用。
以下是定义对象的AWS JavaScript SDK 示例。params
它建议为了更改系统定义的元数据,您不需要在 Metadata 对象中指定它,而是直接在params
对象内部定义它。您在 Metadata 对象中定义的任何内容都将成为用户定义的。
var params = {
Bucket: 'STRING_VALUE', /* required */
Key: 'STRING_VALUE', /* required */
ACL: private | public-read | public-read-write | authenticated-read | aws-exec-read | bucket-owner-read | bucket-owner-full-control,
BucketKeyEnabled: true || false,
CacheControl: 'STRING_VALUE',
ContentDisposition: 'STRING_VALUE',
ContentEncoding: 'STRING_VALUE',
ContentLanguage: 'STRING_VALUE',
ContentType: 'STRING_VALUE',
ExpectedBucketOwner: 'STRING_VALUE',
Expires: new Date || 'Wed Dec 31 1969 16:00:00 GMT-0800 (PST)' || 123456789,
GrantFullControl: 'STRING_VALUE',
GrantRead: 'STRING_VALUE',
GrantReadACP: 'STRING_VALUE',
GrantWriteACP: 'STRING_VALUE',
Metadata: {
'<MetadataKey>': 'STRING_VALUE',
/* '<MetadataKey>': ... */
},
...
}