Разбор данных в кодировке Base64, содержащих изображение из AWS Lambda с Python - PullRequest
0 голосов
/ 15 октября 2019

У меня есть функция лямбда-функции с методом POST, которая должна иметь возможность получать изображение в виде данных нескольких форм, загружать изображение, выполнять некоторые вычисления и возвращать простой массив чисел. Функция Lambda находится за шлюзом API с включенной интеграцией Lambda-Proxy и multipart/form-data, установленным в качестве бинарного типа носителя.

Однако я не могу понять, как анализироватьмультиформные данные, которые возвращаются из AWS Lambda.

event['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_type равно 'multipart/form-data; boundary=--------------------------881952313555430391739156'.

Запуск через компоненты multipart_data, как это ..

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 с помощью Image.open?


Дополнительная информация:

Вот небольшое приложение Flask, которое я использую для отправки изображения и возврата данных о событии:

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),
    }

, а вот запрос POSTMAN в виде кода 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)
...