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:
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user