将PIL图片上传至S3桶时Lambda报错问题求助
问题分析与解决方案
报错sequence item 0: expected str instance, bytes found的核心原因是处理Base64字符串时传入了字节类型数据,结合你的代码,还有几个潜在问题需要一并修复:
关键问题点
- 未初始化S3客户端实例,直接调用
s3_client会引发未定义错误 - 未处理API Gateway可能传递的字节类型请求体
- 未考虑请求体中可能存在的
data:image/png;base64,前缀(如果前端直接传递完整Data URI的话) - 缺少异常捕获与合法响应返回
修正后的代码
import logging import boto3 import base64 import json from io import BytesIO from botocore.exceptions import ClientError from PIL import Image # 初始化S3客户端 s3_client = boto3.client('s3') def lambda_handler(event, context): s3_bucket = 'xxx' # 替换为你的S3桶名 base64_image = event.get('body', '') if not base64_image: return { 'statusCode': 400, 'body': json.dumps('No image data found in the request body.') } try: # 处理字节类型的请求体,转换为字符串 if isinstance(base64_image, bytes): base64_image = base64_image.decode('utf-8') # 移除可能存在的Data URI前缀(如果有) if ',' in base64_image: base64_image = base64_image.split(',')[1] # 解码Base64并打开图片 image = Image.open(BytesIO(base64.b64decode(base64_image))) # 你的图片处理代码... # 将处理后的图片写入BytesIO image_bytes = BytesIO() image.save(image_bytes, format='PNG') image_bytes.seek(0) # 上传至S3 s3_client.upload_fileobj( image_bytes, s3_bucket, 'haha', ExtraArgs={'ContentType': 'image/png'} ) return { 'statusCode': 200, 'body': json.dumps('Image uploaded successfully.') } except base64.binascii.Error: return { 'statusCode': 400, 'body': json.dumps('Invalid base64 image data.') } except IOError: return { 'statusCode': 400, 'body': json.dumps('Failed to process image data.') } except ClientError as e: logging.error(e) return { 'statusCode': 500, 'body': json.dumps(f'S3 upload failed: {e.response["Error"]["Message"]}') } except Exception as e: logging.error(e) return { 'statusCode': 500, 'body': json.dumps(f'Unhandled error: {str(e)}') }
额外说明
- 如果你的API Gateway配置了二进制媒体类型,请求体可能会以字节形式传递,因此需要先转成字符串再处理
- 前端传递的图片如果是完整的Data URI格式(包含
data:image/xxx;base64,前缀),必须移除前缀才能正确解码 - 添加异常捕获可以让你更清晰地定位问题,同时返回符合API规范的响应
内容的提问来源于stack exchange,提问作者SamTest
相关产品推荐
相关产品推荐

