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