You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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)}')
        }

额外说明

  1. 如果你的API Gateway配置了二进制媒体类型,请求体可能会以字节形式传递,因此需要先转成字符串再处理
  2. 前端传递的图片如果是完整的Data URI格式(包含data:image/xxx;base64,前缀),必须移除前缀才能正确解码
  3. 添加异常捕获可以让你更清晰地定位问题,同时返回符合API规范的响应

内容的提问来源于stack exchange,提问作者SamTest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:10:04