python - 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”,但没有任何变化。
任何想法 ?
解决方案
这是一个旧帖子,但我试图解决它而发疯。
事实证明,我的解决方案是将所有二进制类型添加到 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': '*'}}
推荐阅读
- javascript - Javascript - 我应该在哪里更新我的 LRU 缓存(同步 UI 状态和缓存)?
- spring - 使用 Spring Sleuth 有条件地传播 span id
- r - 如果前几列不包含在范围内,如何更改前几列的名称并使其余列保持原样?
- html - 调整输入表单的大小
- asp.net - 使用 itextsharp vb.net 的阿拉伯语问题
- php - 分页重写规则将原始 url 添加到末尾
- qr-code - 将 ascii qr 代码添加到 alpine 签名文件
- python - 使用 geopandas 从 NetCDF 数据中提取国家
- c++ - std::sort 可以专门使用 as-if 规则对 int* 使用冒泡排序吗?
- c++ - 在 Eclipse 中同步 C/C++ 项目的问题