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

Postman上传base64编码图片到Lambda函数报embedded null byte错误如何解决

问题复现

你需要通过Postman向Lambda函数上传Base64编码的图片,请求体结构如下:

{
  "name": "vendor",
  "image": "base64-encoded"
}

注:原请求体示例缺少"name": "vendor"后的逗号,属于非法JSON结构,实际请求时需要先补全,否则Lambda解析body时会直接报错。

现有Lambda代码如下:

try:
    data = json.loads(event['body'])
    name = data['name']
    image = data['image']
    image  = base64.b64decode(data['image'])
    cdn_object = CDNConnector('bunny_cdn_api_key','assets')
    cdn_object.upload_file('vendor-assets/', image)
    return {
        'statusCode': 200,
        "body": json.dumps("File uploaded")
    }
except Exception as e:
    return {
        "statusCode":200,
        "body": str(e)
    }

运行时报embedded null byte错误,原因是Base64解码后得到的是bytes类型数据,而Bunny CDN的upload_file方法要求传入文件对象/本地文件路径,不支持直接传入原始bytes。

解决方案

方案1:用类文件对象封装bytes(推荐,无需写本地磁盘)

无需生成实际的磁盘文件,用Python内置的io.BytesIO把解码后的bytes包装成类文件对象即可,同时先处理可能存在的Base64前缀,避免无效字符导致解码出现空字节:
修改后完整代码:

import json
import base64
import io
# 你自己的CDNConnector导入保留

try:
    data = json.loads(event['body'])
    name = data['name']
    image_b64 = data['image']
    
    # 步骤1:去除Base64可能带的data URI前缀(比如data:image/png;base64,)
    if ';base64,' in image_b64:
        image_b64 = image_b64.split(';base64,')[1]
    
    # 步骤2:解码Base64
    image_bytes = base64.b64decode(image_b64)
    
    # 步骤3:封装为类文件对象
    image_file = io.BytesIO(image_bytes)
    
    # 步骤4:上传时指定完整的文件路径,包含文件名+后缀,避免只传目录
    # 这里假设是png格式,你可以根据实际传的图片类型调整,或者从Base64前缀里提取格式
    upload_path = f'vendor-assets/{name}.png'
    
    cdn_object = CDNConnector('bunny_cdn_api_key','assets')
    cdn_object.upload_file(upload_path, image_file)
    
    return {
        'statusCode': 200,
        "body": json.dumps("File uploaded")
    }
except Exception as e:
    return {
        "statusCode": 500, # 出错时建议返回500而非200,方便前端识别错误
        "body": str(e)
    }

方案2:生成临时文件(如果CDN要求传入本地文件路径)

如果upload_file方法只接受本地文件路径作为参数,可以用Python内置的tempfile模块生成临时文件:

# 其他导入同上,新增tempfile、os导入
import tempfile
import os

try:
    # 前面Base64处理、解码的步骤和方案1一致
    data = json.loads(event['body'])
    name = data['name']
    image_b64 = data['image']
    if ';base64,' in image_b64:
        image_b64 = image_b64.split(';base64,')[1]
    image_bytes = base64.b64decode(image_b64)
    
    # 生成临时文件
    with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
        tmp.write(image_bytes)
        tmp_path = tmp.name
    
    # 上传临时文件
    upload_path = f'vendor-assets/{name}.png'
    cdn_object = CDNConnector('bunny_cdn_api_key','assets')
    cdn_object.upload_file(upload_path, tmp_path)
    
    # 上传完成后删除临时文件
    os.unlink(tmp_path)
    
    return {
        'statusCode': 200,
        "body": json.dumps("File uploaded")
    }
except Exception as e:
    return {
        "statusCode": 500,
        "body": str(e)
    }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:54:02