【问题标题】:How do I update/define system metadata for an AWS S3 object while creating a presigned url using Node.js SDK如何在使用 Node.js 开发工具包创建预签名 URL 时更新/定义 AWS S3 对象的系统元数据
【发布时间】:2022-02-06 23:22:27
【问题描述】:

我目前正在生成一个预签名的 URL 以将对象上传到我的 AWS s3 存储桶 const 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 并将对象上传到我的存储桶,但是当我尝试使用 s3.getSignedUrl 方法访问对象时,会下载对象而不是打开的 png 图像我的浏览器标签。现在,通过我所做的所有研究,我明白为什么会发生这种情况。那是因为我的对象的系统定义的对象元数据Content-Type 仍然是binary/octet-stream。 即使我尝试将要为其生成预签名 url 的对象的 Content-Type 更改为 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 时,无法找到使用适用于 Node.js 的 AWS 开发工具包更改系统定义的元数据 Content-Type 的方法。需要你的帮助。谢谢!

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 sdk


    【解决方案1】:

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

    以下是定义params 对象的AWS JavaScript SDK example。它建议为了更改系统定义的元数据,您不需要在 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>': ... */
      },
      ...
    }
    

    【讨论】:

      【解决方案2】:

      对于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
         }
      

      在我的情况下,我想创建 2 个 URL,一个会在单击时将 mp4 文件下载到磁盘(ResponseContentType: 'application/binary-stream'),第二个会弹出一个浏览器选项卡并播放视频(ResponseContentType: 'video/mp4')。

      这与 S3 中的系统 Content-Type 值无关。虽然如果 S3 中的值设置为 video/mp4,您实际上可以省略 ResponseContentType 参数,默认值将是您的 S3 系统内容类型设置。

      【讨论】:

        猜你喜欢
        • 2020-01-30
        • 2018-10-02
        • 2014-02-26
        • 2015-04-15
        • 2019-08-09
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多