我在Python中使用Serverless framework。我试图完成的是让一个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}
}
最佳答案
我已经将图像上传到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'
}