AWS Lambda处理图片存入S3时遇Base64解码错误求助
AWS API + Lambda 图片存S3解码错误解决建议
问题场景与代码
通过Postman向自建AWS API发送图片,使用Lambda函数处理请求,将图片Base64解码后存入S3存储桶,但解码时触发错误。Lambda代码如下:
def lambda_handler(event, context): img_data = base64.b64decode(event['body']) # Guarda la imagen en un archivo temporal aux_path = '/tmp/{}.jpg'.format(generate_unique_id()) with open(aux_path, 'wb') as f: f.write(img_data) # Sube la imagen a S3 bucket = 'mys3' s3_key = '{}.jpg'.format(generate_unique_id()) s3.upload_file(aux_path, bucket, s3_key) return { 'statusCode': 200, 'body': json.dumps({'message': 'file saved successfully'}), 'headers': {'Access-Control-Allow-Origin': '*'} }
错误信息
解码时触发如下错误:
[ERROR] ValueError: string argument should contain only ASCII characters Traceback (most recent call last): File "/var/task/lambda_function.py", line 16, in lambda_handler img_data = base64.b64decode(event['body']) File "/var/lang/lib/python3.12/base64.py", line 83, in b64decode s = _bytes_from_decode_data(s) File "/var/lang/lib/python3.12/base64.py", line 39, in _bytes_from_decode_data raise ValueError('string argument should contain only ASCII characters')
已在API配置中添加二进制媒体类型“/”,但问题依旧。Post请求采用form-data格式上传图片。
解决建议
修正API Gateway二进制配置
- 直接添加
multipart/form-data到二进制媒体类型列表中,避免仅用“/”通配符(部分场景下通配符解析逻辑存在问题)。 - 修改配置后必须重新部署API,确保新配置生效。
- 直接添加
重构Lambda请求解析逻辑
当前代码错误地将整个form-data表单的二进制Base64数据当作纯图片解码,需改用表单解析工具处理:- 为Lambda添加
python-multipart依赖(通过Lambda层或打包部署)。 - 修改代码如下:
import base64 import json import uuid import boto3 from multipart import MultipartParser s3 = boto3.client('s3') def generate_unique_id(): return str(uuid.uuid4()) def lambda_handler(event, context): # 解析multipart/form-data请求体 raw_body = base64.b64decode(event['body']) content_type = event['headers']['Content-Type'] parser = MultipartParser(raw_body, content_type) # 获取图片字段(需与Postman中表单字段名一致,示例为'image') image_part = parser.parts.get('image') if not image_part: return { 'statusCode': 400, 'body': json.dumps({'message': '请求中未找到图片'}), 'headers': {'Access-Control-Allow-Origin': '*'} } # 直接上传图片内容到S3,无需临时文件 bucket = 'mys3' s3_key = f'{generate_unique_id()}.jpg' s3.put_object( Bucket=bucket, Key=s3_key, Body=image_part.raw, ContentType=image_part.headers.get('Content-Type') ) return { 'statusCode': 200, 'body': json.dumps({'message': 'file saved successfully'}), 'headers': {'Access-Control-Allow-Origin': '*'} }
- 为Lambda添加
验证Postman请求设置
- 确认请求方法为POST,URL正确。
- Body选择
form-data,字段名与Lambda代码中保持一致,类型选择File并上传目标图片。 - 无需手动对图片做Base64编码,让Postman自动处理表单提交。
检查Lambda权限
确保Lambda执行角色拥有S3的putObject权限,避免因权限不足导致后续上传失败。
内容的提问来源于stack exchange,提问作者Tom Smiths
相关产品推荐
相关产品推荐

