使用Python解析包含AWS Lambda图像的Base64编码数据
我有一个Lambda函数设置,带有使用Python解析包含AWS Lambda图像的Base64编码数据,python,image,aws-lambda,base64,multipart,Python,Image,Aws Lambda,Base64,Multipart,我有一个Lambda函数设置,带有POST方法,该方法应该能够接收图像作为多表单数据,加载图像,进行一些计算并返回一个简单的数字数组。Lambda函数位于启用Lambda代理集成的API网关后面,并且多部分/表单数据设置为二进制媒体类型 然而,我似乎一辈子都不知道如何解析AWS Lambda返回的多表单数据 事件['body']包含base64编码的数据,我无法在此发布,因为它占用了太多空间 我使用以下代码片段来解析多表单数据: from requests_toolbelt.multipart
POST
方法,该方法应该能够接收图像作为多表单数据,加载图像,进行一些计算并返回一个简单的数字数组。Lambda函数位于启用Lambda代理集成的API网关后面,并且多部分/表单数据
设置为二进制媒体类型
然而,我似乎一辈子都不知道如何解析AWS Lambda返回的多表单数据
事件['body']
包含base64编码的数据,我无法在此发布,因为它占用了太多空间
我使用以下代码片段来解析多表单数据:
from requests_toolbelt.multipart import decoder
multipart_string = base64.b64decode(body)
content_type = data['event']['headers']['Content-Type']
multipart_data = decoder.MultipartDecoder(multipart_string, content_type)
其中content\u type
是的多部分/表单数据;边界=------------------------------------8819523135554530391739156'
像这样运行多部分数据的组件
for part in multipart_data.parts:
print(part.content)
print(part.headers)
给这个。内容(太长,无法发布)如下所示:
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\ ... x00\x7f\xff\xd9'
以及标题:
{b'Content-Disposition': b'form-data; name="image"; filename="8281460-3x2-700x467.jpg"', b'Content-Type': b'image/jpeg'}
但是,我仍然不清楚a)内容的哪一部分是实际图像b)如何提取图像,例如使用图像将其放入PIL
。打开
补充信息:
下面是我用来发布图像和返回事件数据的小烧瓶应用程序:
import json
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def hello(event, context):
response = {
"statusCode": 200,
"event": event
}
return {
"body": json.dumps(response),
}
以下是邮递员请求的Python代码:
import requests
url = "url-to-lambda-function"
payload = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"image\"; filename=\"8281460-3x2-700x467.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
headers = {
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
'User-Agent': "PostmanRuntime/7.18.0",
'Accept': "*/*",
'Cache-Control': "no-cache",
'Content-Type': "multipart/form-data; boundary=--------------------------881952313555430391739156",
'Accept-Encoding': "gzip, deflate",
'Content-Length': "30417",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
表示(rest)API网关的最大负载大小为10MB。
你没有提供你的图像大小,但是如果它超过10MB,那么考虑重新设计你的架构。我建议将图像上传到S3,这样lambda函数将返回一个。图像上传到S3后,您可以在lambda函数中获取该对象并进行计算。
对于任何来到这里的人,我就是这样解决的:
body = event["body"]
content_type = event["headers"]["Content-Type"]
body_dec = base64.b64decode(body)
multipart_data = decoder.MultipartDecoder(body_dec, content_type)
binary_content = []
for part in multipart_data.parts:
binary_content.append(part.content)
imageStream = io.BytesIO(binary_content[0])
imageFile = Image.open(imageStream)
imageArray = np.array(imageFile)
这将产生一个您可以使用的数组,因为您对我来说,困难在于理解多部分/表单数据是如何再次缝合在一起的。要添加到tmo的答案中:我的多部分/表单数据帖子(到带有API网关代理集成的AWS lambda)要求我访问内容类型标题,而不是使用:
content\u type=event['multiValueHeaders']['content-type'][0]
然后使用以下命令访问tmo二进制内容列表中的部分表单数据:
...
file_content = binary_content[0]
filename = str(binary_content[1].decode())
team_id = str(binary_content[2].decode())
问题真的很让人困惑,lambda doyour part.content看起来像什么二进制数据——这是您的图像吗?