通过Amazon API网关和Lambda上传图像

10

我有一个带有API网关Lambda的REST API。

我想为上传个人资料图片创建一个端点,将文件传递给一个Lambda函数,在那里调整大小、将其注册到数据库并返回新图像的URL路径。

这些服务有没有任何方法可以实现这样的功能?我在网上找不到任何资料(唯一的建议是直接上传到S3,需要IAM权限,并触发一个Lambda函数来调整图片大小)。

谢谢

更新:

AWS升级了APIGATEWAY,现在可以通过端点发送二进制数据
感谢@blue和@Manzo的评论。


2
API网关现在支持二进制数据。 - Manzo
1
是的,这里有一个例子:https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/ - balu
2个回答

4
直接将文件上传到S3并不一定需要IAM权限。您可以创建一个API端点,返回预签名的S3 URL,然后可以使用该URL直接将文件上传到S3。API端点背后的Lambda函数是唯一需要正确的S3存储桶IAM权限的内容。

7
你说得没错,但我有自己的Lambda函数来授权用户,并根据他的ID将文件保存到S3存储桶中。我不认为让用户获取S3 URL,然后上传文件是个好主意。API的重点在于抽象逻辑和基础设施,用户不应该处理所有这些事情,甚至不应该知道我们使用了S3或AWS。 - Yonatan

1
由于API Gateway和Lambda目前不支持原生文件上传,您可以将文件转换为base64编码的图片传递给API Gateway,然后再传递给Lambda函数。您的Lambda函数可以对其进行base64解码、调整大小、将其注册到数据库并返回新图像的URL路径。

谢谢。我尝试了你说的方法。但是我遇到了Could not parse request body into json: Unrecognized token错误。我的请求模板中有这个属性:payload: $input.body。它应该将文件正文(body)作为字符串返回,但却抛出了错误。 - Yonatan
修复了!添加 $util.base64Encode()。属性看起来像这样:"payload": "$util.base64Encode($input.body)" - Yonatan
现在我得到了一个损坏的文件。它是 application/octet-stream 类型,我无法操作或确定图像类型。有解决方案吗? - Yonatan
@JoJoB。你能解决这个问题吗?我也遇到了同样的问题。 - advncd
@advncd 我使用了下面的建议。我有一个端点,可以为我提供s3存储桶的签名URL,然后我直接上传它。您可以在此签名URL上尝试权限、文件类型和文件大小。目前API网关会对每个输入进行JSON编码,因此图像数据将会被破坏(或者至少我不知道如何解码)。我认为他们计划为API网关添加更多功能之一就是文件上传。 - Yonatan
希望API网关尽快支持二进制数据。 - advncd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接