我目前正在生成一个预签名的url,以将对象上传到我的AWS s3 bucketconst signedUrl = await s3.getSignedUrl('putObject', params);
这是我的params对象:
const params = {
Bucket: 'mybucket',
Key: `mybucketpost-${Math.ceil(Math.random() * 10 ** 10)}.png`,
ContentType: 'image/png',
Metadata: {
ContentType: 'image/png',
},
Expires: 36000
}
我可以成功地生成一个预先签名的URL并将一个对象上传到我的bucket中,但当我试图使用s3.getSignedUrl
方法访问该对象时,该对象会被下载,而不是在浏览器选项卡中打开的png图像。现在,通过我所做的所有研究,我明白了为什么会发生这种情况。这是因为系统为我的对象定义的对象元数据Content-Type
仍然是binary/octet-stream
。尽管我已经尝试将生成预签名url的对象的内容类型更改为image/png
,但它会作为用户生成的对象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
不幸的是,这并不能解决在浏览器选项卡中加载图像的问题。我已经尝试过直接通过AWS控制台将对象的系统定义元数据Content-Type
更改为image/png
,正如预期的那样,该对象(png(在我的浏览器选项卡中使用对象URL打开,但在使用putObject
属性生成预签名URL的同时,我找不到使用AWS SDK for Node.js更改系统定义元数据Content-Type
的方法。同样需要你的帮助。谢谢
我在上传到S3时尝试设置Content-Disposition元数据时遇到了同样的问题。在我的情况下,通过删除params中的Metadata
对象对我有效
以下是定义params
对象的AWS JavaScript SDK示例。它建议,为了更改系统定义的元数据,您不需要在元数据对象中指定它,而是直接在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>': ... */
},
...
}
对于getSignedURL(...)
设置,ResponseContentType
对我的作用如下:
signedUrl = await s3.getSignedUrl('putObject', params);
const params = {
Bucket: 'mybucket',
Key: `mybucketpost-${Math.ceil(Math.random() * 10 ** 10)}.png`,
ResponseContentType: 'application/binary-stream',
Expires: 36000
}
在我的情况下,我想创建两个URLS,其中一个URLS将在单击时将mp4文件下载到磁盘(ResponseContentType:'application/binarystream'(,第二个URLS会弹出浏览器选项卡并播放视频( ResponseContentType:'video/mp4'这与S3中的系统内容类型值无关。尽管如果S3中的值设置为video/mp4,您实际上可以省略ResponseContentType参数,默认值将是S3系统内容类型设置。