节点 AWS S3 获取对象元数据?

Sim*_*leJ 3 amazon-s3 amazon-web-services node.js

我正在尝试使用预签名 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
  },
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ale*_*nko 6

您不能使用 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();
Run Code Online (Sandbox Code Playgroud)

文档

  • const {Body, Metadata} = wait s3.getObject({Bucket, Key}).promise() 获取元数据和对象 @Bianca (5认同)
  • 感谢您及时的回复。这会很有用。当然,获取对象元数据的函数不称为“getObjectMetadata”。 (3认同)