from fastapi import APIRouter, UploadFile, File, Depends from typing import List import uuid from datetime import datetime from app.core.cos import cos_client from app.core.config import settings from app.models.upload import UploadResponse, MultiUploadResponse from app.core.response import success_response, error_response, ResponseModel from app.api.deps import get_current_user from app.models.user import UserDB router = APIRouter() async def upload_to_cos(file: UploadFile) -> str: """上传文件到腾讯云COS""" # 生成唯一文件名 ext = file.filename.split('.')[-1] if '.' in file.filename else '' filename = f"{datetime.now().strftime('%Y%m%d')}/{uuid.uuid4()}.{ext}" # 上传文件 cos_client.put_object( Bucket=settings.COS_BUCKET, Body=await file.read(), Key=filename, ContentType=file.content_type, ACL="public-read" ) # 返回文件URL return f"https://{settings.COS_BASE_URL}/{filename}" @router.post("/image", response_model=ResponseModel) async def upload_image( file: UploadFile = File(...), current_user: UserDB = Depends(get_current_user) ): """上传单张图片""" if not file.content_type.startswith('image/'): return error_response(code=400, message="只能上传图片文件") try: url = await upload_to_cos(file) return success_response(data=UploadResponse(url=url)) except Exception as e: return error_response(code=500, message=f"上传失败: {str(e)}") @router.post("/images", response_model=ResponseModel) async def upload_images( files: List[UploadFile] = File(...), current_user: UserDB = Depends(get_current_user) ): """上传多张图片""" if len(files) > 5: return error_response(code=400, message="最多同时上传5张图片") urls = [] try: for file in files: if not file.content_type.startswith('image/'): return error_response(code=400, message="只能上传图片文件") url = await upload_to_cos(file) urls.append(url) return success_response(data=MultiUploadResponse(urls=urls)) except Exception as e: return error_response(code=500, message=f"上传失败: {str(e)}")