S3 预签名 URL 不适用于 Whatsapp 云 Api

问题描述 投票:0回答:1

我的目标是通过 Whatsapp 从 s3 发送图像。如果我从 aws 控制台获得预签名的 url,我可以按预期发送图像,我收到 200 并且它显示在聊天中。但是当我从 lambda 函数上的 aws-sdk 获取 url 时,我收到 200 但图像没有出现在聊天中。我可以在任何浏览器中正常访问这两个网址。我正在测试邮递员中发送的聊天消息。

从控制台:https://MY_BUCKET.s3.us-east-1.amazonaws.com/%2Ftmp/MY_FILE?response-content-disposition=inline&X-Amz-Security-Token=BIG_ENCODED_TOKEN&X-Amz-Algorithm=AWS4- HMAC-SHA256&X-Amz-Date=20240329T204315Z&X-Amz-SignedHeaders=主机&X-Amz-Expires=60&X-Amz-Credential=ANOTHER_CREDENTIAL_WITH_MY_REGION&X-Amz-Signature=ANOTHER_SIGNATURE

通过 SDK:https://MY_BUCKET.s3.us-east-1.amazonaws.com//tmp/MY_FILE?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X- Amz-Credential=ANOTHER_CREDENTIAL_WITH_MY_REGION&X-Amz-Date=20240329T194855Z&X-Amz-Expires=3600&X-Amz-Security-Token=BIG_ENCODED_TOKEN&X-Amz-Signature=ANOTHER_SIGNATURE&X-Amz-SignedHeaders=主机&x-id=GetObject

我的 lambda 代码: 从 '@aws-sdk/client-s3' 导入 { S3Client, GetObjectCommand }; 从 '@aws-sdk/s3-request-presigner' 导入 { getSignedUrl };

const s3Client = new S3Client({ 区域: 'MY_REGION' });

导出 const handler = async (event) => { 让参数= { 存储桶:“BUCKET_NAME”, 键:'OBJECT_KEY', 到期时间:3600 }; 尝试 { const 命令 = new GetObjectCommand(params); const presignedUrl = wait getSignedUrl(s3Client, command, { expiresIn: params.Expires }); 返回 presignedUrl; } 捕获(错误){ 返回错误; }

};

我检查了政策和角色,我还需要检查其他内容吗?我如何从 sdk 获取与控制台相同的预置 url,以便我可以在云 api 中发送?

javascript amazon-web-services amazon-s3 aws-lambda whatsapp-cloud-api
1个回答
0
投票

这里的主要问题是您需要在 s3 存储桶中对象的元数据中指定对象的内容类型,因此内容类型需要与您的文件 mimetype 相同。

您可以直接在 s3 aws 控制台的对象中编辑内容类型:

object actions -> edit metadata
。然后您可以更改文件 mimetype 的 content-type 值。

在代码中,您需要将其放入参数中:'ContentDisposition:

attachment; filename=${PUT_HERE_THE_FILE_NAME}
'

在您的代码中 -> export const handler = async (event) => { let params = { Bucket: 'BUCKET_NAME', Key: 'OBJECT_KEY', Expires: 3600, ContentDisposition:

attachment; filename=${PUT_HERE_THE_FILE_NAME}
};

此外,当您将文件移动到 s3 存储桶时,您需要指定文件的内容类型,如下所示:

    const command = new CopyObjectCommand({
        CopySource: `${file.path}/${file.filename}`,
        Bucket: newPath,
        Key: newName,
        ContentType: file.format
    });

或者这个:

    const { UploadId } = await this.s3Client.send(new CreateMultipartUploadCommand({
        Key: filename,
        Bucket: path,
        ContentType: mimetype
    }));
© www.soinside.com 2019 - 2024. All rights reserved.