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
相关产品推荐
相关产品推荐

