首页 > 解决方案 > 如何在使用 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。需要你的帮助。谢谢!

标签: node.jsamazon-web-servicesamazon-s3sdk

解决方案


当我在上传到 S3 时尝试设置 Content-Disposition 元数据时遇到了同样的问题。就我而言,通过删除Metadataparams 中的对象对我有用。

以下是定义对象的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>': ... */
  },
  ...
}

推荐阅读