fix: add avatar photo upload endpoint to digital-avatar-app backend

- Add POST /api/avatar/{id}/photo endpoint
- Save uploaded photos to UPLOAD_DIR/{avatar_id}/
- Update avatar.photo_url in database
- Import UPLOAD_DIR from knowledge router
This commit is contained in:
stefanfeng
2026-08-07 15:10:59 +08:00
parent b7f8ac203b
commit e3cce871b0
+43 -1
View File
@@ -1,7 +1,11 @@
from fastapi import APIRouter, Depends, Body, Header from fastapi import APIRouter, Depends, Body, Header, UploadFile, File
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
import os
import uuid
import mimetypes
from database import get_db from database import get_db
from routers.knowledge import UPLOAD_DIR
from models import Avatar, KnowledgeDoc, KnowledgeChunk, QAPair, Authorization, User from models import Avatar, KnowledgeDoc, KnowledgeChunk, QAPair, Authorization, User
from responses import ok, fail from responses import ok, fail
@@ -93,3 +97,41 @@ def delete_avatar(avatar_id: str, db: Session = Depends(get_db)):
db.delete(a) db.delete(a)
db.commit() db.commit()
return ok({"success": True}) return ok({"success": True})
@router.post("/avatar/{avatar_id}/photo")
async def upload_avatar_photo(
avatar_id: str,
file: UploadFile = File(...),
db: Session = Depends(get_db),
):
"""上传数字分身头像"""
a = db.query(Avatar).filter(Avatar.id == avatar_id).first()
if not a:
return fail("分身不存在", 404)
# 验证文件类型
if not file.content_type or not file.content_type.startswith("image/"):
return fail("仅支持图片文件", 400)
file_bytes = await file.read()
if len(file_bytes) > 5 * 1024 * 1024:
return fail("头像文件不能超过5MB", 400)
# 保存到 uploads 目录
ext = mimetypes.guess_extension(file.content_type) or ".jpg"
filename = f"avatar-{uuid.uuid4().hex}{ext}"
avatar_dir = os.path.join(UPLOAD_DIR, avatar_id)
os.makedirs(avatar_dir, exist_ok=True)
file_path = os.path.join(avatar_dir, filename)
with open(file_path, "wb") as f:
f.write(file_bytes)
# 更新数据库
photo_url = f"/api/files/{avatar_id}/{filename}"
a.photo_url = photo_url
db.commit()
db.refresh(a)
return ok(a.to_dict())