oss_service.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. """
  2. OSS 上传服务
  3. """
  4. import oss2
  5. from typing import Optional
  6. from utils.config import settings
  7. from utils.logger import logger
  8. from utils.crypto import encrypt_url, decrypt_url
  9. class OSSService:
  10. def __init__(self):
  11. auth = oss2.Auth(settings.oss.access_key_id, settings.oss.access_key_secret)
  12. self.bucket = oss2.Bucket(auth, settings.oss.endpoint, settings.oss.bucket)
  13. self.encrypt_key = settings.oss.parse_encrypt_key
  14. def upload_file(self, file_data: bytes, filename: str, folder: str = "uploads") -> str:
  15. """上传文件到OSS"""
  16. try:
  17. object_name = f"{folder}/{filename}"
  18. result = self.bucket.put_object(object_name, file_data)
  19. if result.status == 200:
  20. file_url = f"https://{settings.oss.bucket}.{settings.oss.endpoint}/{object_name}"
  21. encrypted_url = encrypt_url(file_url)
  22. logger.info(f"文件上传成功: {object_name}")
  23. return encrypted_url
  24. else:
  25. raise Exception(f"上传失败,状态码: {result.status}")
  26. except Exception as e:
  27. logger.error(f"OSS上传失败: {e}")
  28. raise
  29. def upload_image(self, file_data: bytes, filename: str) -> str:
  30. """上传图片"""
  31. return self.upload_file(file_data, filename, folder="images")
  32. def upload_json(self, json_data: str, filename: str) -> str:
  33. """上传JSON文件"""
  34. return self.upload_file(json_data.encode('utf-8'), filename, folder="json")
  35. def get_file_url(self, object_name: str, expires: int = 3600) -> str:
  36. """获取文件访问URL"""
  37. try:
  38. url = self.bucket.sign_url('GET', object_name, expires)
  39. return url
  40. except Exception as e:
  41. logger.error(f"获取文件URL失败: {e}")
  42. raise
  43. def parse_url(self, encrypted_url: str) -> str:
  44. """解析加密的URL"""
  45. try:
  46. return decrypt_url(encrypted_url)
  47. except Exception as e:
  48. logger.error(f"URL解析失败: {e}")
  49. raise
  50. def get_signed_url(self, filename: str, expires: int = 3600) -> str:
  51. """获取签名URL"""
  52. try:
  53. object_name = f"shudao/{filename}"
  54. url = self.bucket.sign_url('GET', object_name, expires)
  55. return url
  56. except Exception as e:
  57. logger.error(f"获取签名URL失败: {e}")
  58. raise
  59. # 全局实例
  60. oss_service = OSSService()