【问题标题】:Serverless and uploading image from Lambda endpoint to S3无服务器并将图像从 Lambda 端点上传到 S3
【发布时间】:2019-01-27 02:42:04
【问题描述】:

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

我正在使用file_uploadobj 函数,它需要一个像对象这样的文件作为它的第一个参数。需要注意的是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}
    }

【问题讨论】:

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


【解决方案1】:

我已将图片上传到 s3 Bucket。在“Lambda 测试事件”中,我创建了一个 json 测试事件,其中包含要上传到 s3 存储桶的图像的 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'
  }

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 2011-11-18
    • 2020-03-04
    • 1970-01-01
    • 2017-01-30
    • 2019-10-05
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多