首页 > 解决方案 > AWS Lambda Python 3 处理 POST 文件

问题描述

我在 AWS Lambda 上使用 Python 3.8,我想处理发布的文件,就像requests.files使用 Django 一样。但使用 AWS Lambda 是不可能的。我想把这个文件放在 S3 中:

s3.put_object(
    Body=fileAsString,
    Bucket=MY_BUCKET,
    Key='my-file.jpg'
)

当我使用文件直接返回接收到的事件时:

在此处输入图像描述

第一次尝试:与cgi.parse_multipart:我我的处理程序:

c_type, c_data = parse_header(event['headers']['Content-Type'])
boundary = c_data['boundary'].encode('latin1')
body = event['body'].encode('utf8')

fp = BytesIO(body)
pdict = {
    'boundary': boundary,
    'CONTENT-LENGTH': str(len(body))
}
form_data = parse_multipart(fp, pdict)
fileBytes: bytes = form_data['file'][0]
return ({'statusCode': 200, 'body': json.dumps(str(fileBytes))}

我收到:在此处输入图像描述 我也尝试过,form_data['file'][0].decode('utf-8')但我收到了:在此处输入图像描述而且我总是有“?”

我应该得到这个,因为它是原始图像,在 edition 中打开: 在此处输入图像描述

第二次尝试:我遵循本教程:https ://medium.com/swlh/upload-binary-files-to-s3-using-aws-api-gateway-with-aws-lambda-2b4ba8c70b8e

所以,我尝试了:

file_content = base64.b64decode(event['body'])

但我得到:

string argument should contain only ASCII characters

(与 相同validate=False)以及当我尝试将 body 作为 dict 加载时:

body2 = json.loads(event['body'])

我得到:

loads failed : Expecting value: line 1 column 1 (char 0)

我尝试在 API 的设置中将“image/png”和“image/*”添加到“Binary Media Types”,但没有任何变化。

任何想法 ?

标签: pythonamazon-web-servicesfileaws-lambda

解决方案


这是一个旧帖子,但我试图解决它而发疯。

事实证明,我的解决方案是将所有二进制类型添加到 API 网关,如下所示: AWS API 网关设置

我的问题是我的代码适用于 .png 文件,但不适用于 .jpg 文件。一旦添加了正确的 MIME 类型“image/jpeg”,一切正常,错误

string argument should contain only ASCII characters

走了。注意:此更改后需要重新部署 API(这不是即时的)

底线:此代码是我的工作代码:

import json
import boto3
import base64
  
s3 = boto3.client('s3')

def lambda_handler(event, context):
if event['httpMethod'] == 'POST' : 
    fileName = event['multiValueQueryStringParameters']['fileName']
    bodyData = event['body']
    decodedFile = base64.b64decode(bodyData)
    s3.put_object(Bucket=<BUCKET_NAME>, Key=fileName[0], Body=decodedFile)
    return {'statusCode': 200, 
        'body': json.dumps({'message': 'file saved successfully'}), 
        'headers': {'Access-Control-Allow-Origin': '*'}}

推荐阅读