FastAPI WebSocket传输Base64图片遇PayloadTooBig问题求助
解决WebSocket传输Base64图片时PayloadTooBig报错问题
问题原因
websockets.exceptions.PayloadTooBig 报错是因为websockets库默认单条消息大小限制(默认1MB)不足以容纳Base64编码后的图片数据——Base64编码会让原文件体积增大约33%,普通图片编码后很容易超过默认限制。
解决方案
通过调整WebSocket连接的max_size参数,放宽单条消息的大小限制即可解决。
1. 修改ConnectionManager的connect方法
在接受WebSocket连接时,指定更大的max_size值(单位:字节),根据你的图片实际大小调整:
class ConnectionManager: def __init__(self): self.active_connections: List[WebSocket] = [] async def connect(self, websocket: WebSocket): # 设置最大接收消息大小为10MB(可根据需求调整,比如20*1024*1024=20MB) await websocket.accept(max_size=10 * 1024 * 1024) self.active_connections.append(websocket) # 其他方法保持不变...
2. 全局设置服务器的max_size(可选)
如果希望所有WebSocket连接都使用统一的大小限制,可以在创建WebSocket服务器时直接指定max_size参数:
import asyncio import websockets async def your_handler(websocket): await manager.connect(websocket) # 后续逻辑... start_server = websockets.serve(your_handler, host="0.0.0.0", port=8000, max_size=10*1024*1024) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()
3. 发送大消息时的额外设置(如果需要)
如果后端需要发送超过默认大小的消息,调用send_text或send_json时也可以指定max_size:
async def send_personal_message(self, message: str, websocket: WebSocket): await websocket.send_text(message, max_size=10 * 1024 * 1024)
注意事项
max_size的取值要根据实际场景调整,避免设置过大导致内存占用过高。- 如果图片体积过大(比如几十MB),建议考虑分片传输(将Base64数据拆分成多个小消息发送,后端拼接),这种方式更节省内存。
内容的提问来源于stack exchange,提问作者Ritik Jain
相关产品推荐
相关产品推荐

