Как получить файл с Aws Lambda (python) - PullRequest
0 голосов
/ 06 ноября 2018

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

Веб-клиенту разрешено отправлять любые типы файлов (скажем, .txt, .docx, .xlsx, ...). Я не знаю, должен ли я использовать двоичный файл или нет.

Идея была сохранить файл после на S3. Теперь я знаю, что можно использовать js-библиотеки, такие как Aws Amplify, и генерировать временный URL, но я не слишком заинтересован в этом решении.

Любая помощь приветствуется, я много искал решение на Python, но я не могу найти ничего реально работающего!

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

files_post:
  handler: post/post.post
  events:
    - http:
        path: files
        method: post
        cors: true
        authorizer: 
          name: authorizer
          arn: ${cf:lCognito.CognitoUserPoolMyUserPool}

РЕДАКТИРОВАТЬ

У меня есть половинное решение, которое работает для текстовых файлов, но не для PDF, XLSX или изображений, если бы кто-то имел, я был бы очень счастлив

from cgi import parse_header, parse_multipart
from io import BytesIO
import json


def post(event, context):


    print event['queryStringParameters']['filename']
    c_type, c_data = parse_header(event['headers']['content-type'])
    c_data['boundary'] = bytes(c_data['boundary']).encode("utf-8")

    body_file = BytesIO(bytes(event['body']).encode("utf-8"))
    form_data = parse_multipart(body_file, c_data)

    s3 = boto3.resource('s3')
    object = s3.Object('storage', event['queryStringParameters']['filename'])
    object.put(Body=form_data['upload'][0])

1 Ответ

0 голосов
/ 06 ноября 2018

Вы используете API Gateway, поэтому ваше лямбда-событие будет отображаться примерно так (из Amazon Docs ):

{
    "resource": "Resource path",
    "path": "Path parameter",
    "httpMethod": "Incoming request's method name"
    "headers": {String containing incoming request headers}
    "multiValueHeaders": {List of strings containing incoming request headers}
    "queryStringParameters": {query string parameters }
    "multiValueQueryStringParameters": {List of query string parameters}
    "pathParameters":  {path parameters}
    "stageVariables": {Applicable stage variables}
    "requestContext": {Request context, including authorizer-returned key-value pairs}
    "body": "A JSON string of the request payload."
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode"
}

Вы можете передать файл как значение base64 в теле и декодировать его в своей лямбда-функции. Возьмите следующий фрагмент Python

def lambda_handler(event, context):
    data = json.loads(event['body'])
    # Let's say we user a regular <input type='file' name='uploaded_file'/>
    encoded_file = data['uploaded_file']
    decoded_file = base64.decodestring(encoded_file)
    # now save it to S3
...