I'm trying to store a user's uploaded files in S3 using presigned URLs. This works fine, but I'm using UUIDs as the filename to avoid conflicts. I need to be able to save the file's original filename, so I'm passing it as metadata in the signed upload URL:
const url = await s3.getSignedUrlPromise('putObject', { Bucket: UPLOAD_BUCKET, Key: key, Expires: AWS_UPLOAD_EXPIRATION / 1000, ContentType: contentType, Metadata: { filename: originalFilename }, }); This also appears to work fine (the metadata is showing in the AWS console). How can I access this metadata? When the client needs to display one of these images, they request a presigned download URL from the server which is generated like this:
const url = await s3.getSignedUrlPromise('getObject', { Bucket: UPLOAD_BUCKET, Key: key, Expires: AWS_DOWNLOAD_EXPIRATION / 1000, }); This URL doesn't appear to include the metadata, and the return value of getSignedUrlPromise is a string, so there doesn't seem to be any room for anything other than the URL itself. I assumed there would be an S3 method for fetching just the metadata, but as far as I can tell it doesn't exist (or has an unintuitive name). This is especially confusing considering the getObjectTagging and getObjectLegalHold methods exist. How can I access metadata through a presigned URL? If that's not possible, how can I fetch the metadata using the AWS SDK? If that's not possible, I must be misunderstanding the point of metadata.