seaweedfs_service.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import requests
  2. from fastapi import UploadFile
  3. from app.core.logger import logger
  4. class SeaweedFSService:
  5. MASTER_URL = "http://visafly.top:9333" # 你的 SeaweedFS master 地址
  6. @classmethod
  7. def upload(cls, file: UploadFile):
  8. """上传文件到 SeaweedFS"""
  9. try:
  10. # 1️⃣ 获取可上传的 volume 地址
  11. assign_resp = requests.get(f"{cls.MASTER_URL}/dir/assign", timeout=5)
  12. assign_data = assign_resp.json()
  13. fid = assign_data["fid"]
  14. public_url = assign_data["publicUrl"]
  15. # 2️⃣ 上传文件数据
  16. upload_url = f"http://{public_url}/{fid}"
  17. files = {"file": (file.filename, file.file, file.content_type)}
  18. upload_resp = requests.post(upload_url, files=files, timeout=10)
  19. if upload_resp.status_code == 201:
  20. return {"fid": fid, "url": upload_url}
  21. else:
  22. logger.error(f"上传失败: {upload_resp.text}")
  23. return None
  24. except Exception as e:
  25. logger.exception(f"SeaweedFS 上传异常, 原因={e}")
  26. return None
  27. @classmethod
  28. def get(cls, fid: str):
  29. """根据 fid 读取文件"""
  30. try:
  31. resp = requests.get(f"{cls.MASTER_URL}/dir/lookup?volumeId={fid.split(',')[0]}", timeout=5)
  32. data = resp.json()
  33. if not data.get("locations"):
  34. return None
  35. public_url = data["locations"][0]["publicUrl"]
  36. file_url = f"http://{public_url}/{fid}"
  37. file_resp = requests.get(file_url, timeout=10)
  38. if file_resp.status_code == 200:
  39. return file_resp.content, file_resp.headers.get("Content-Type", "application/octet-stream")
  40. else:
  41. return None
  42. except Exception as e:
  43. logger.exception(f"SeaweedFS 读取异常, 原因={e}")
  44. return None
  45. @classmethod
  46. def delete(cls, fid: str):
  47. """删除文件"""
  48. try:
  49. resp = requests.get(f"{cls.MASTER_URL}/dir/lookup?volumeId={fid.split(',')[0]}", timeout=5)
  50. data = resp.json()
  51. if not data.get("locations"):
  52. return False
  53. public_url = data["locations"][0]["publicUrl"]
  54. delete_url = f"http://{public_url}/{fid}"
  55. del_resp = requests.delete(delete_url, timeout=10)
  56. return del_resp.status_code == 202
  57. except Exception as e:
  58. logger.exception(f"SeaweedFS 删除异常, 原因={e}")
  59. return False