我在Python中使用Serverless framework。我试图完成的是让一个HTTP端点由无服务器设置,并让该端点上传一个图像到S3。客户端Android会从他们的手机上传一张图片,并用图片点击端点。我已经能够成功地上传到S3,但是当我点击download打开图片时,它看起来已经损坏了。
python - 无服务器并将图像从Lambda端点上传到S3-LMLPHP
我正在使用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}
    }

最佳答案

我已经将图像上传到s3 Bucket。在“Lambda Test Event”中,我创建了一个json测试事件,其中包含要上载到s3 Bucket的BASE64图像和图像名。作为fallows的Lambda Test 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'
  }

08-07 22:29
查看更多