Загрузка файлов с помощью HTML POST -> API-> Lambda -> s3 — Amazon API Gateway p26

#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, которые вы будете декодировать. Если вы спросите меня, я думаю, что это не очень хорошая практика, когда речь идет о больших файлах или большом количестве файлов.