file.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. from typing import Optional
  2. import json
  3. from fastapi import APIRouter, File, Request, UploadFile
  4. from pydantic import BaseModel
  5. from services.oss_service import oss_service
  6. router = APIRouter()
  7. @router.post("/oss/upload")
  8. async def upload(
  9. request: Request,
  10. file: UploadFile = File(...),
  11. ):
  12. """Upload a generic file to OSS."""
  13. user = request.state.user
  14. if not user:
  15. return {"statusCode": 401, "msg": "未授权"}
  16. try:
  17. content = await file.read()
  18. file_url = oss_service.upload_file(content, file.filename)
  19. return {
  20. "statusCode": 200,
  21. "msg": "上传成功",
  22. "data": {"file_url": file_url},
  23. }
  24. except Exception as e:
  25. return {"statusCode": 500, "msg": f"上传失败: {str(e)}"}
  26. @router.post("/oss/shudao/upload_image")
  27. async def upload_image(
  28. request: Request,
  29. file: Optional[UploadFile] = File(None),
  30. image: Optional[UploadFile] = File(None),
  31. ):
  32. """Upload an image to OSS.
  33. Supports both the current `file` form field and the legacy `image` field
  34. used by the existing frontend.
  35. """
  36. user = request.state.user
  37. if not user:
  38. return {"statusCode": 401, "msg": "未授权"}
  39. try:
  40. upload_file = image or file
  41. if not upload_file:
  42. return {"statusCode": 422, "msg": "缺少图片文件"}
  43. content = await upload_file.read()
  44. file_url = oss_service.upload_image(content, upload_file.filename)
  45. return {
  46. "statusCode": 200,
  47. "msg": "上传成功",
  48. "fileUrl": file_url,
  49. "fileURL": file_url,
  50. "fileName": upload_file.filename,
  51. "fileSize": len(content),
  52. "data": {
  53. "image_url": file_url,
  54. "file_url": file_url,
  55. "file_name": upload_file.filename,
  56. "file_size": len(content),
  57. },
  58. }
  59. except Exception as e:
  60. return {"statusCode": 500, "msg": f"上传失败: {str(e)}"}
  61. class UploadJsonRequest(BaseModel):
  62. filename: str
  63. content: dict
  64. @router.post("/oss/shudao/upload_json")
  65. async def upload_ppt_json(
  66. request: Request,
  67. data: UploadJsonRequest,
  68. ):
  69. """Upload JSON content to OSS."""
  70. user = request.state.user
  71. if not user:
  72. return {"statusCode": 401, "msg": "未授权"}
  73. try:
  74. json_str = json.dumps(data.content, ensure_ascii=False)
  75. file_url = oss_service.upload_json(json_str, data.filename)
  76. return {
  77. "statusCode": 200,
  78. "msg": "上传成功",
  79. "data": {"file_url": file_url},
  80. }
  81. except Exception as e:
  82. return {"statusCode": 500, "msg": f"上传失败: {str(e)}"}
  83. @router.get("/oss/parse")
  84. async def parse_oss(url: str, request: Request):
  85. """Resolve an OSS proxy URL."""
  86. user = request.state.user
  87. if not user:
  88. return {"statusCode": 401, "msg": "未授权"}
  89. try:
  90. decrypted_url = oss_service.parse_url(url)
  91. return {
  92. "statusCode": 200,
  93. "msg": "success",
  94. "data": {"url": decrypted_url},
  95. }
  96. except Exception as e:
  97. return {"statusCode": 500, "msg": f"解析失败: {str(e)}"}
  98. @router.get("/get_file_link")
  99. async def get_file_link(
  100. filename: str,
  101. request: Request,
  102. ):
  103. """Get a signed OSS URL by filename."""
  104. user = request.state.user
  105. if not user:
  106. return {"statusCode": 401, "msg": "未授权"}
  107. try:
  108. file_url = oss_service.get_signed_url(filename)
  109. return {
  110. "statusCode": 200,
  111. "msg": "success",
  112. "data": {"file_url": file_url},
  113. }
  114. except Exception as e:
  115. return {"statusCode": 500, "msg": f"获取失败: {str(e)}"}