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