Files
rustfs-s3-toolkit/examples/basic_usage.py
2025-07-23 22:44:33 +08:00

194 lines
6.5 KiB
Python

#!/usr/bin/env python3
"""
RustFS S3 Storage Toolkit 基本使用示例
演示所有 9 个核心功能的使用方法
已在 RustFS 1.0.0-alpha.34 上完成测试
"""
import tempfile
from pathlib import Path
from datetime import datetime
from rustfs_s3_toolkit import S3StorageToolkit
def main():
"""RustFS S3 Storage Toolkit 使用示例"""
# 1. 初始化工具包
print("🚀 RustFS S3 Storage Toolkit 使用示例")
print("🧪 测试环境: RustFS 1.0.0-alpha.34")
print("=" * 50)
# 配置信息 - 请根据实际 RustFS 情况修改
config = {
"endpoint_url": "https://your-rustfs-endpoint.com",
"access_key_id": "your-access-key-id",
"secret_access_key": "your-secret-access-key",
"bucket_name": "your-bucket-name",
"region_name": "us-east-1"
}
# 创建工具包实例
toolkit = S3StorageToolkit(**config)
print("✅ 工具包初始化完成")
# 2. 测试连接
print("\n📡 测试连接...")
result = toolkit.test_connection()
if result['success']:
print(f"✅ 连接成功: {result['message']}")
print(f"📊 存储桶数量: {result['bucket_count']}")
print(f"🎯 目标存储桶存在: {result['target_bucket_exists']}")
else:
print(f"❌ 连接失败: {result['error']}")
return
# 3. 上传文件
print("\n📤 上传文件...")
# 创建测试文件
test_content = f"Hello RustFS S3 Storage Toolkit!\n创建时间: {datetime.now().isoformat()}"
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt', encoding='utf-8') as f:
f.write(test_content)
test_file = f.name
# 上传文件
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
remote_key = f"examples/test_file_{timestamp}.txt"
result = toolkit.upload_file(test_file, remote_key)
if result['success']:
print(f"✅ 文件上传成功")
print(f"📁 远程路径: {result['key']}")
print(f"🔗 公开链接: {result['public_url']}")
print(f"📊 文件大小: {result['file_size']} 字节")
else:
print(f"❌ 文件上传失败: {result['error']}")
# 4. 创建文件夹
print("\n📁 创建文件夹...")
folder_path = f"examples/test_folder_{timestamp}/"
result = toolkit.create_folder(folder_path)
if result['success']:
print(f"✅ 文件夹创建成功: {result['folder_path']}")
else:
print(f"❌ 文件夹创建失败: {result['error']}")
# 5. 上传目录
print("\n📂 上传目录...")
# 创建测试目录
test_dir = tempfile.mkdtemp(prefix='s3_example_')
test_dir_path = Path(test_dir)
# 创建一些测试文件
(test_dir_path / "file1.txt").write_text("这是文件1", encoding='utf-8')
(test_dir_path / "file2.txt").write_text("这是文件2", encoding='utf-8')
# 创建子目录
sub_dir = test_dir_path / "subdir"
sub_dir.mkdir()
(sub_dir / "file3.txt").write_text("这是子目录中的文件", encoding='utf-8')
# 上传目录
remote_prefix = f"examples/test_directory_{timestamp}/"
result = toolkit.upload_directory(test_dir, remote_prefix)
if result['success']:
print(f"✅ 目录上传成功")
print(f"📁 本地目录: {result['local_directory']}")
print(f"🌐 远程前缀: {result['remote_prefix']}")
print(f"📊 文件数量: {result['file_count']}")
print("📄 上传的文件:")
for file_key in result['uploaded_files']:
print(f" - {file_key}")
else:
print(f"❌ 目录上传失败: {result['error']}")
# 6. 列出文件
print("\n📋 列出文件...")
result = toolkit.list_files(prefix="examples/", max_keys=10)
if result['success']:
print(f"✅ 文件列表获取成功")
print(f"📊 文件数量: {result['file_count']}")
print("📄 文件列表:")
for file_info in result['files']:
size_mb = file_info['size'] / (1024 * 1024)
print(f" - {file_info['key']} ({size_mb:.3f} MB)")
else:
print(f"❌ 文件列表获取失败: {result['error']}")
# 7. 下载文件
print("\n📥 下载文件...")
download_path = tempfile.mktemp(suffix='_downloaded.txt')
result = toolkit.download_file(remote_key, download_path)
if result['success']:
print(f"✅ 文件下载成功")
print(f"📁 本地路径: {result['local_path']}")
print(f"📊 文件大小: {result['file_size']} 字节")
# 验证下载的内容
with open(download_path, 'r', encoding='utf-8') as f:
downloaded_content = f.read()
if test_content == downloaded_content:
print("✅ 文件内容验证成功")
else:
print("❌ 文件内容验证失败")
else:
print(f"❌ 文件下载失败: {result['error']}")
# 8. 下载目录
print("\n📂 下载目录...")
download_dir = tempfile.mkdtemp(prefix='s3_download_')
result = toolkit.download_directory(remote_prefix, download_dir)
if result['success']:
print(f"✅ 目录下载成功")
print(f"📁 本地目录: {result['local_directory']}")
print(f"🌐 远程前缀: {result['remote_prefix']}")
print(f"📊 文件数量: {result['file_count']}")
print("📄 下载的文件:")
for file_path in result['downloaded_files']:
print(f" - {file_path}")
else:
print(f"❌ 目录下载失败: {result['error']}")
# 9. 删除文件
print("\n🗑️ 删除文件...")
result = toolkit.delete_file(remote_key)
if result['success']:
print(f"✅ 文件删除成功: {result['key']}")
else:
print(f"❌ 文件删除失败: {result['error']}")
# 10. 删除目录
print("\n🗑️ 删除目录...")
result = toolkit.delete_directory(remote_prefix)
if result['success']:
print(f"✅ 目录删除成功")
print(f"📊 删除文件数量: {result['deleted_count']}")
else:
print(f"❌ 目录删除失败: {result['error']}")
# 清理本地文件
import os
import shutil
try:
os.unlink(test_file)
os.unlink(download_path)
shutil.rmtree(test_dir)
shutil.rmtree(download_dir)
print("\n🧹 本地临时文件清理完成")
except:
pass
print("\n🎉 示例演示完成!")
if __name__ == "__main__":
main()