aliyun_util.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import logging
  2. import os
  3. from app.config import settings
  4. from app.util.file_util import generate_unique_filename
  5. logger = logging.getLogger(__name__)
  6. def upload_file(
  7. local_path: str,
  8. oss_key: str,
  9. endpoint: str | None = None,
  10. access_key_id: str | None = None,
  11. access_key_secret: str | None = None,
  12. ) -> str | None:
  13. if not local_path or not oss_key:
  14. logger.error("Local file path or OSS key is blank.")
  15. return None
  16. if not os.path.isfile(local_path):
  17. logger.error("Local file does not exist: %s", local_path)
  18. return None
  19. ep = endpoint or settings.aliyun_endpoint
  20. aki = access_key_id or settings.aliyun_access_key_id
  21. aks = access_key_secret or settings.aliyun_access_key_secret
  22. bucket_name = settings.aliyun_bucket_name
  23. try:
  24. import oss2
  25. auth = oss2.Auth(aki, aks)
  26. bucket = oss2.Bucket(auth, ep, bucket_name)
  27. logger.debug("Uploading to OSS: %s -> %s", local_path, oss_key)
  28. bucket.put_object_from_file(oss_key, local_path)
  29. oss_url = f"https://{bucket_name}.{ep}/{oss_key}"
  30. logger.debug("Successfully uploaded: %s", oss_url)
  31. return oss_url
  32. except Exception as e:
  33. logger.error("Failed to upload file to OSS: %s -> %s, %s", local_path, oss_key, e)
  34. return None
  35. def upload_files(
  36. local_paths: list[str],
  37. oss_prefix: str,
  38. endpoint: str | None = None,
  39. access_key_id: str | None = None,
  40. access_key_secret: str | None = None,
  41. ) -> list[str]:
  42. uploaded: list[str] = []
  43. if not local_paths:
  44. return uploaded
  45. if not oss_prefix:
  46. oss_prefix = "uploads/"
  47. if not oss_prefix.endswith("/"):
  48. oss_prefix += "/"
  49. for path in local_paths:
  50. try:
  51. name = generate_unique_filename(os.path.basename(path))
  52. key = oss_prefix + name
  53. url = upload_file(path, key, endpoint, access_key_id, access_key_secret)
  54. if url:
  55. uploaded.append(url)
  56. except Exception as e:
  57. logger.error("Failed to upload file: %s, %s", path, e)
  58. return uploaded