#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. Это именно то, что я искал, спасибо