#html #amazon-web-services #api #post #lambda
#HTML #amazon-веб-сервисы #API #Публикация #лямбда — выражение
Вопрос:
У меня уже есть код для загрузки одного файла в s3 через lambda / api Его работа с html post «»
Я основывался на видеоролике YouTube, посвященном Amazon API Gateway p26
но теперь я не буду обрабатывать несколько файлов, как мне с этим справиться?
<html>
<title>Upload file</title>
<h3>Upload file funk....</h3>
<form method="post" enctype="multipart/form-data", action="https://*********.eu-west-2.amazonaws.com/v101/upload">
Select File test2:
<input type="file" name="file[]" multiple>
<input type="submit" name="submit" value="Upload">
</form>
</html>
это код моей лямбда-функции
import json
import base64
import boto3
import email
def lambda_handler(event, context):
s3 = boto3.client("s3")
post_data = base64.b64decode(event['body'])
content_type = event["headers"]['content-type']
ct = "Content-Type: " content_type "n"
# parsing message from bytes
msg = email.message_from_bytes(ct.encode() post_data)
# checking if the message is multipart
print("Multipart check : ", msg.is_multipart())
# if message is multipart
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)
s3_upload = s3.put_object(Bucket="zdjeciatotxt", Key=file_name, Body=multipart_content["file"])
Ответ №1:
Я также передавал несколько файлов в теле в виде данных формы, я кодировал их в base64, чтобы получить их как base64 в моей лямбда-функции, а затем при необходимости декодировал.
Но это не очень хорошая практика, когда дело доходит до больших файлов.
Размер полезной нагрузки 10 МБ
API Gateway имеет жесткий лимит в 10 МБ для полезных нагрузок, поэтому, как только вы достигнете его, он выйдет из строя. То, что я делаю для больших файлов, проходит напрямую через S3. Вызов API связан с лямбдой, которая генерирует подписанный URL-адрес, который возвращается клиенту, таким образом, клиент может напрямую загрузить файл в S3, независимо от его размера. Но вам нужно будет выполнить несколько запросов для нескольких файлов или вернуть массив URL-адресов, это зависит от вас. Я думаю, так безопаснее.
TL; DR Я думаю, вам нужно настроить параметры вашего API (например, сопоставление запросов), чтобы передавать данные base64 в ваш Lambda, которые вы будете декодировать. Если вы спросите меня, я думаю, что это не очень хорошая практика, когда речь идет о больших файлах или большом количестве файлов.