from typing import Optional import json from fastapi import APIRouter, File, Request, UploadFile from pydantic import BaseModel from services.oss_service import oss_service router = APIRouter() @router.post("/oss/upload") async def upload( request: Request, file: UploadFile = File(...), ): """Upload a generic file to OSS.""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: content = await file.read() file_url = oss_service.upload_file(content, file.filename) return { "statusCode": 200, "msg": "上传成功", "data": {"file_url": file_url}, } except Exception as e: return {"statusCode": 500, "msg": f"上传失败: {str(e)}"} @router.post("/oss/shudao/upload_image") async def upload_image( request: Request, file: Optional[UploadFile] = File(None), image: Optional[UploadFile] = File(None), ): """Upload an image to OSS. Supports both the current `file` form field and the legacy `image` field used by the existing frontend. """ user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: upload_file = image or file if not upload_file: return {"statusCode": 422, "msg": "缺少图片文件"} content = await upload_file.read() file_url = oss_service.upload_image(content, upload_file.filename) return { "statusCode": 200, "msg": "上传成功", "fileUrl": file_url, "fileURL": file_url, "fileName": upload_file.filename, "fileSize": len(content), "data": { "image_url": file_url, "file_url": file_url, "file_name": upload_file.filename, "file_size": len(content), }, } except Exception as e: return {"statusCode": 500, "msg": f"上传失败: {str(e)}"} class UploadJsonRequest(BaseModel): filename: str content: dict @router.post("/oss/shudao/upload_json") async def upload_ppt_json( request: Request, data: UploadJsonRequest, ): """Upload JSON content to OSS.""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: json_str = json.dumps(data.content, ensure_ascii=False) file_url = oss_service.upload_json(json_str, data.filename) return { "statusCode": 200, "msg": "上传成功", "data": {"file_url": file_url}, } except Exception as e: return {"statusCode": 500, "msg": f"上传失败: {str(e)}"} @router.get("/oss/parse") async def parse_oss(url: str, request: Request): """Resolve an OSS proxy URL.""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: decrypted_url = oss_service.parse_url(url) return { "statusCode": 200, "msg": "success", "data": {"url": decrypted_url}, } except Exception as e: return {"statusCode": 500, "msg": f"解析失败: {str(e)}"} @router.get("/get_file_link") async def get_file_link( filename: str, request: Request, ): """Get a signed OSS URL by filename.""" user = request.state.user if not user: return {"statusCode": 401, "msg": "未授权"} try: file_url = oss_service.get_signed_url(filename) return { "statusCode": 200, "msg": "success", "data": {"file_url": file_url}, } except Exception as e: return {"statusCode": 500, "msg": f"获取失败: {str(e)}"}