| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import logging
- import os
- from app.config import settings
- from app.util.file_util import generate_unique_filename
- logger = logging.getLogger(__name__)
- def upload_file(
- local_path: str,
- oss_key: str,
- endpoint: str | None = None,
- access_key_id: str | None = None,
- access_key_secret: str | None = None,
- ) -> str | None:
- if not local_path or not oss_key:
- logger.error("Local file path or OSS key is blank.")
- return None
- if not os.path.isfile(local_path):
- logger.error("Local file does not exist: %s", local_path)
- return None
- ep = endpoint or settings.aliyun_endpoint
- aki = access_key_id or settings.aliyun_access_key_id
- aks = access_key_secret or settings.aliyun_access_key_secret
- bucket_name = settings.aliyun_bucket_name
- try:
- import oss2
- auth = oss2.Auth(aki, aks)
- bucket = oss2.Bucket(auth, ep, bucket_name)
- logger.debug("Uploading to OSS: %s -> %s", local_path, oss_key)
- bucket.put_object_from_file(oss_key, local_path)
- oss_url = f"https://{bucket_name}.{ep}/{oss_key}"
- logger.debug("Successfully uploaded: %s", oss_url)
- return oss_url
- except Exception as e:
- logger.error("Failed to upload file to OSS: %s -> %s, %s", local_path, oss_key, e)
- return None
- def upload_files(
- local_paths: list[str],
- oss_prefix: str,
- endpoint: str | None = None,
- access_key_id: str | None = None,
- access_key_secret: str | None = None,
- ) -> list[str]:
- uploaded: list[str] = []
- if not local_paths:
- return uploaded
- if not oss_prefix:
- oss_prefix = "uploads/"
- if not oss_prefix.endswith("/"):
- oss_prefix += "/"
- for path in local_paths:
- try:
- name = generate_unique_filename(os.path.basename(path))
- key = oss_prefix + name
- url = upload_file(path, key, endpoint, access_key_id, access_key_secret)
- if url:
- uploaded.append(url)
- except Exception as e:
- logger.error("Failed to upload file: %s, %s", path, e)
- return uploaded
|