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

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二进制配置

    1. 直接添加multipart/form-data到二进制媒体类型列表中,避免仅用“/”通配符(部分场景下通配符解析逻辑存在问题)。
    2. 修改配置后必须重新部署API,确保新配置生效。
  • 重构Lambda请求解析逻辑
    当前代码错误地将整个form-data表单的二进制Base64数据当作纯图片解码,需改用表单解析工具处理:

    1. 为Lambda添加python-multipart依赖(通过Lambda层或打包部署)。
    2. 修改代码如下:
      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': '*'}
          }
      
  • 验证Postman请求设置

    1. 确认请求方法为POST,URL正确。
    2. Body选择form-data,字段名与Lambda代码中保持一致,类型选择File并上传目标图片。
    3. 无需手动对图片做Base64编码,让Postman自动处理表单提交。
  • 检查Lambda权限
    确保Lambda执行角色拥有S3的putObject权限,避免因权限不足导致后续上传失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:42:25