阿里云 OSS 文件管理 (aliyun_oss)
本模块封装了与阿里云 OSS 服务交互的核心功能。通过 OssManager 类,用户可以轻松实现文件上传、下载、删除以及目录操作等功能,适用于云存储管理和大规模文件处理场景。
OssManager 类详细说明
- class OssManager(endpoint: str, bucket_name: str, api_key: str | None = None, api_secret: str | None = None, verbose: bool = True)
OssManager 类用于管理与阿里云 OSS 的交互,支持文件的上传、下载、删除,以及目录内容的列举与读取。
主要功能:
根据指定的 OSS endpoint 和 bucket_name 初始化连接。
上传本地文件、文本或图像到 OSS。
下载单个文件或具有特定前缀的多个文件。
列出所有文件键或根据前缀过滤后的文件键。
删除指定文件或根据前缀删除多个文件。
上传和下载整个目录。
读取 OSS 上存储文件的内容。
检查文件是否存在,获取文件元数据,复制和移动文件等高级操作。
方法:
__init__(self, endpoint: str, bucket_name: str, api_key: Optional[str]=None, api_secret: Optional[str]=None, verbose: bool=True)
构造函数,用于初始化 OssManager 实例。
参数:
endpoint: OSS 服务的访问地址。
bucket_name: 桶名称,用于指定存储空间。
api_key: 用户的 API Key,可选参数。
api_secret: 用户的 API Secret,可选参数。
verbose: 是否启用详细输出,默认为 True。
_print_info(self, message: str)
内部方法,用于打印提示信息,帮助调试或记录日志。
_print_warning(self, message: str)
内部方法,用于打印警告信息。
_check_write_permission(self) -> bool
检查当前 OSS 账号是否具备写权限,返回布尔值。
download_file(self, key: str, root_dir: Optional[str]=None, use_basename: bool = False) -> bool
下载 OSS 中指定 key 的文件,并存储到 root_dir 目录中(如果指定)。
参数:
key: OSS 中的键值
root_dir: 下载文件的根目录,默认为当前目录
use_basename: 是否只使用 key 的文件名部分构建本地路径,默认为 False。 如果为 True,则 a/b/c.txt 下载到 root_dir/c.txt; 如果为 False,则下载到 root_dir/a/b/c.txt。
返回:
布尔值,指示是否成功下载。
download_files_with_prefix(self, prefix: str, root_dir: Optional[str]=None, use_basename: bool = False) -> bool
下载 OSS 中所有以指定前缀开头的文件,存储到指定目录中。
参数:
prefix: 键值前缀
root_dir: 下载文件的根目录,默认为当前目录
use_basename: 是否只使用 key 的文件名部分构建本地路径,与 download_file 相同
list_all_keys(self, sort: bool=True) -> List[str]
列出 OSS 桶中所有的文件键,支持按字母排序。
list_keys_with_prefix(self, prefix: str, sort: bool=True) -> List[str]
根据前缀过滤并列出 OSS 桶中匹配的文件键。
upload_file(self, key: str, file_path: str) -> bool
将本地文件上传到 OSS,并指定存储的 key。
返回:
布尔值,指示上传操作是否成功。
upload_text(self, key: str, text: str) -> bool
上传文本内容到 OSS,并存储为指定 key 对应的文件。
upload_image(self, key: str, image: np.ndarray) -> bool
上传以 numpy 数组表示的图像到 OSS,适用于图像存储需求。
delete_file(self, key: str) -> bool
删除 OSS 中指定 key 的文件。
delete_files_with_prefix(self, prefix: str) -> bool
删除 OSS 中所有以指定前缀开头的文件。
upload_directory(self, local_path: str, prefix: str=””) -> bool
将本地目录上传到 OSS,所有文件存储时会以 prefix 作为路径前缀。
download_directory(self, prefix: str, local_path: str, use_basename: bool = False) -> bool
下载 OSS 中指定前缀的所有文件,并存储到本地目录中。
参数:
prefix: 键值前缀
local_path: 下载文件的本地目录
use_basename: 是否只使用 key 的文件名部分构建本地路径,与 download_file 相同
list_directory_contents(self, prefix: str, sort: bool=True) -> List[tuple[str, bool]]
列出 OSS 中指定目录(通过前缀指定)的内容,返回每个文件或子目录的键和是否为目录的标识。
read_file_content(self, key: str) -> Optional[str]
读取 OSS 上存储的文件内容,并返回字符串形式的内容。
key_exists(self, key: str) -> bool
检查指定的键值是否存在于 OSS 中。
参数:
key: 要检查的 OSS 键值
返回:
布尔值,表示键值是否存在
get_file_metadata(self, key: str) -> Optional[dict]
获取 OSS 中指定文件的元数据信息。
参数:
key: OSS 中的键值
返回:
包含元数据信息的字典,如不存在则返回 None
copy_object(self, source_key: str, target_key: str) -> bool
在 OSS 中复制文件。
参数:
source_key: 源文件的键值
target_key: 目标文件的键值
返回:
布尔值,表示复制操作是否成功
move_object(self, source_key: str, target_key: str) -> bool
在 OSS 中移动文件(复制后删除源文件)。
参数:
source_key: 源文件的键值
target_key: 目标文件的键值
返回:
布尔值,表示移动操作是否成功
使用示例
下面的示例展示了如何使用 OssManager 完成基本的文件上传和下载操作:
from pywayne.aliyun_oss import OssManager
# 初始化 OssManager 实例
oss = OssManager(endpoint="https://oss-cn-xxx.aliyuncs.com", bucket_name="my-bucket", api_key="your_api_key", api_secret="your_api_secret")
# 上传本地文件到 OSS
success = oss.upload_file(key="data/sample.txt", file_path="./sample.txt")
if success:
print("文件上传成功!")
# 列出所有文件键
keys = oss.list_all_keys()
print("当前文件列表:", keys)
# 下载指定文件到本地目录
success = oss.download_file(key="data/sample.txt", root_dir="./downloads")
if success:
print("文件下载成功!")
# 读取 OSS 上文件的内容
content = oss.read_file_content(key="data/sample.txt")
print("文件内容:", content)
# 检查文件是否存在
if oss.key_exists("data/sample.txt"):
print("文件存在")
# 获取文件元数据
metadata = oss.get_file_metadata("data/sample.txt")
print("文件大小:", metadata.get("size"), "字节")
# 复制文件
oss.copy_object("data/sample.txt", "backup/sample.txt")
# 移动文件
oss.move_object("data/temp.txt", "archive/temp.txt")
模块扩展建议
如果未来需要实现更复杂的 OSS 操作,如多线程上传、断点续传或更细粒度的权限控制,可以在 OssManager 类的基础上进行扩展,以满足不同应用场景的需求。