Как получить имя файла из простого запроса curl post в aws lambda через aws API gateway

#amazon-web-services #lambda #aws-api-gateway

#amazon-web-services #лямбда #aws-api-gateway

Вопрос:

У меня есть следующий запрос curl,

 curl -X POST "https://foo123.execute-api.us-east-1.amazonaws.com/default/test-2" 
-H "accept: application/json" 
-H "Content-Type: multipart/form-data" 
-F "file=@wiki.png;type=image/png"
 

Из-за существующей структуры конвейера я не могу изменить текущую архитектуру этого запроса curl, я хочу получить доступ к имени этого файла в функции lambda, когда я использую aws API gateway в качестве триггера.

Я знаю, что могу просто отправить имя файла в заголовке, но это не работает для конвейера, с которым я собираюсь его использовать, поэтому мой вопрос.

Как я могу получить доступ к имени этого файла внутри лямбда-функции в aws, учитывая, что я не могу изменить свой запрос curl.

Чтобы еще больше прояснить мой вопрос в API flask, мы можем получить имя этого загруженного файла, просто используя что-то вроде.

 args = upload_parser.parse_args()
            
uploaded_file = args['file']  


required_file_name = uploaded_file.filename
 

Комментарии:

1. какой тип интеграции в apigateway для lambda вы используете?

2. @samtoddler использует http-шлюз, никаких ограничений на это не может перейти в режим REST, если мы сможем решить проблему

Ответ №1:

Интересная проблема, на самом деле вы получаете значения тела в виде изображения в кодировке base64, вам придется либо использовать любую из существующих библиотек для анализа его имени и содержимого из body, либо написать свой собственный анализатор, вы можете обратиться к приведенному ниже фрагменту кода для справки :

 import cv2
import os
import base64
import numpy as np
import email   

def http_api(event):
    post_data = base64.b64decode(event['body'])
    # fetching content-type
    try:
        content_type = event["headers"]['Content-Type']
    except:
        content_type = event["headers"]['content-type']
    # concate Content-Type: with content_type from event
    ct = "Content-Type: " content_type "n"

    # parsing message from bytes
    msg = email.message_from_bytes(ct.encode() post_data)

    if msg.is_multipart():
        multipart_content = {}
        # retrieving form-data
        for part in msg.get_payload():
            # checking if filename exist as a part of content-disposition header
            if part.get_filename():
                # fetching the filename
                file_name = part.get_filename()
            multipart_content[part.get_param('name', header='content-disposition')] = part.get_payload(decode=True)

        img_str = multipart_content["file"]
        nparr = np.fromstring(img_str, np.uint8)
        image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)            

    return image
 

Комментарии:

1. Это именно то, что я искал, спасибо