| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- 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)}"}
|