无服务器并将图像从Lambda端点上传到S3

时间:2018-08-20 23:28:12

标签: python amazon-s3 aws-lambda aws-api-gateway serverless-framework

我将Serverless framework与Python结合使用。我要完成的工作是通过Serverless设置HTTP端点,并使该端点将图像上传到S3。客户端Android将从他们的手机上传图片,然后点击图片。我已经能够成功上传到S3,但是当我单击download的图像并尝试打开它时,它似乎已损坏。

enter image description here

我正在使用file_uploadobj函数,它希望将像object这样的文件作为第一个参数。请注意,event['body']的类型为unicode

这是我用来完成此上传的代码。

import boto3

def upload_image(event, context):
    headers, body = event['headers'] ,event['body']
    client = boto3.client('s3', region_name='us-west-2')
    filename = event['queryStringParameters']['filename']
    tmp_filename = '/tmp/' + filename
    file__ = open(tmp_filename, 'wb')
    file__.write(body)
    # file__.write(body.encode('utf-8'))
    # file__.write(body.encode('base64'))
    file__.close()
    with open(tmp_filename, 'rb') as file_data:
        client.upload_fileobj(file_data, 'bucket', filename, ExtraArgs={'ContentType': 'image/jpeg'})
    return {
        'statusCode': 200,
        'body': {'path': filename}
    }

有人对我在做什么错有任何想法吗?

我还使用upload_file尝试了以下操作。

import base64

def upload_image(event, context):
    headers, body = event['headers'] ,event['body']
    client = boto3.client('s3', region_name='us-west-2')
    filename = event['queryStringParameters']['filename']
    tmp_filename = '/tmp/' + filename
    with open(tmp_filename, 'wb') as file_descriptor:
        file_descriptor.write(base64.b64decode(data))
    client.upload_file(tmp_filename, 'bucket', filename, ExtraArgs={'ContentType': 'image/jpeg'})
    return {
        'statusCode': 200,
        'body': {'path': filename}
    }

1 个答案:

答案 0 :(得分:0)

我已将图像上传到s3 Bucket。在“ Lambda测试事件”中,我创建了一个json测试事件,其中包含要上传到s3存储桶和图像名称的Image的BASE64。 Lambda测试JSON事件为休假=======

        { 
            "ImageName": "Your Image Name",
            "img64":"BASE64 of Your Image"
        }

以下是将图像或任何文件上传到s3的代码=======

import boto3
import base64
def lambda_handler(event, context):
    s3 = boto3.resource(u's3')
    bucket = s3.Bucket(u'YOUR-BUCKET-NAME')
    path_test = '/tmp/output'         # temp path in lambda.
    key = event['ImageName']          # assign filename to 'key' variable
    data = event['img64']             # assign base64 of an image to data variable 
    data1 = data
    img = base64.b64decode(data1)     # decode the encoded image data (base64)
    with open(path_test, 'wb') as data:
        #data.write(data1)
        data.write(img)
        bucket.upload_file(path_test, key)   # Upload image directly inside bucket
        #bucket.upload_file(path_test, 'FOLDERNAME-IN-YOUR-BUCKET /{}'.format(key))    # Upload image inside folder of your s3 bucket.
    print('res---------------->',path_test)
    print('key---------------->',key)

    return {
        'status': 'True',
   'statusCode': 200,
   'body': 'Image Uploaded'
  }