Home > Back-end >  How to upload image to s3 with lambda and API gateway
How to upload image to s3 with lambda and API gateway

Time:01-29

I want to upload an image to s3 with lambda and Api gateway when i submit form how can i do it in python.

currently i am getting this error while i am trying to upload image through PostMan

Could not parse request body into json: Could not parse payload into json: Unexpected character (\'-\' (code 45))

my code currently is

import json
import boto3
import base64

s3 = boto3.client('s3')
def lambda_handler(event, context):
    print(event)
    try:
        if event['httpMethod'] == 'POST' : 
            print(event['body'])
            data = json.loads(event['body'])
            name = data['name']
            image = data['file']
            image = image[image.find(",") 1:]
            dec = base64.b64decode(image   "===")
            s3.put_object(Bucket='', Key="", Body=dec)
            return {'statusCode': 200, 'body': json.dumps({'message': 'successful lambda function call'}), 'headers': {'Access-Control-Allow-Origin': '*'}}
    except Exception as e:
        return{
            'body':json.dumps(e)
        }

CodePudding user response:

You don't need Lambda for this. You can proxy S3 API with API Gateway https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html

CodePudding user response:

Doing an upload through API Gateway and Lambda has its limitations: You can not handle large files and there is an execution timeout of 30 seconds as I recall. I would go with creating a presigned url that is requested by the client through API gateway, then use it as the endpoint to put the file.

Something like this will go in your Lambda ,

(This is a NodeJs example)

const uploadUrl = S3.getSignedUrl( 'putObject', {
                Bucket: get(aPicture, 'Bucket'),
                Key: get( aPicture, 'Key'),
                Expires: 600,
            })
    callback( null, { url })

(NodeJs) https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property

(Python) https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.generate_presigned_url

  •  Tags:  
  • Related