Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python解析包含AWS Lambda图像的Base64编码数据_Python_Image_Aws Lambda_Base64_Multipart - Fatal编程技术网

使用Python解析包含AWS Lambda图像的Base64编码数据

使用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

我有一个Lambda函数设置,带有
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看起来像什么二进制数据——这是您的图像吗?