【问题标题】:Node AWS S3 get object metadata?节点 AWS S3 获取对象元数据?
【发布时间】:2020-01-03 06:34:51
【问题描述】:

我正在尝试使用预签名 URL 将用户上传的文件存储在 S3 中。这很好用,但我使用 UUID 作为文件名以避免冲突。我需要能够保存文件的原始文件名,因此我将其作为元数据传递到签名上传 URL 中:

const url = await s3.getSignedUrlPromise('putObject', {
  Bucket: UPLOAD_BUCKET,
  Key: key,
  Expires: AWS_UPLOAD_EXPIRATION / 1000,
  ContentType: contentType,
  Metadata: {
    filename: originalFilename
  },
});

这似乎也可以正常工作(元数据显示在 AWS 控制台中)。如何访问此元数据?当客户端需要显示这些图像之一时,他们会从服务器请求一个预签名的下载 URL,生成如下:

const url = await s3.getSignedUrlPromise('getObject', {
  Bucket: UPLOAD_BUCKET,
  Key: key,
  Expires: AWS_DOWNLOAD_EXPIRATION / 1000,
});

这个 URL 似乎不包含元数据,getSignedUrlPromise 的返回值是一个字符串,所以除了 URL 本身之外似乎没有任何空间。我假设会有一个 S3 方法来获取元数据,但据我所知它不存在(或者有一个不直观的名称)。考虑到存在 getObjectTagginggetObjectLegalHold 方法,这尤其令人困惑。如何通过预签名 URL 访问元数据?如果这不可能,我如何使用 AWS 开发工具包获取元数据?如果这不可能,那我一定是误解了元数据的意义。

【问题讨论】:

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


    【解决方案1】:

    您无法使用 URL 获取元数据,但您可以使用 s3.headObject 方法:

    const config = new AWS.Config({
          accessKeyId: 'your acessKey',
          secretAccessKey: 'your secret',
          region: 'your region',
        });
    const s3 = new AWS.S3(config);
    
    const params = {
      Bucket: 'your bucket',
      Key: 'your assetKey'
    }
    const metaData = await s3.headObject(params).promise();
    

    Documentation

    【讨论】:

    • 感谢您的快速回复。这会很好用。当然获取对象元数据的函数不叫getObjectMetadata..
    • 如果我想同时检索对象及其元数据怎么办?使用当前的方法,您需要发出两个请求:getSignedUrlPromise 和 headObject,对吗?当您想要获取有关同一对象的信息时,这似乎相当无效 - 有没有一种方法可以在单个请求中执行?
    • const {Body, Metadata} = await s3.getObject({Bucket, Key}).promise() 获取元数据和对象@Bianca
    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多