【发布时间】: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}
}
【问题讨论】:
-
你能看一下对象的元数据吗?对象的内容类型和大小是什么?
-
@KendrickKesley 这里是身体的数据gist.github.com/Petesta/d1d0d18b0694923f29b97d747d22cff2。
content-type是multipart/form-data。
标签: python amazon-s3 aws-lambda aws-api-gateway serverless-framework