upload_to_oss.py 4.79 KB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
上传文件到阿里云 OSS
"""

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import os
import sys

def get_credentials():
    """获取 OSS 凭证"""
    # 1. 首先尝试环境变量
    access_key_id = os.getenv('OSS_ACCESS_KEY_ID')
    access_key_secret = os.getenv('OSS_ACCESS_KEY_SECRET')
    
    if access_key_id and access_key_secret:
        print("✅ 从环境变量读取凭证")
        return access_key_id, access_key_secret
    
    # 2. 尝试 .env 文件
    env_file = '/Users/yibo/Documents/LemonAI/multi-agent-system/.env'
    if os.path.exists(env_file):
        with open(env_file, 'r') as f:
            for line in f:
                line = line.strip()
                if line.startswith('export OSS_ACCESS_KEY_ID='):
                    access_key_id = line.split('=', 1)[1].strip().strip("'")
                elif line.startswith('export OSS_ACCESS_KEY_SECRET='):
                    access_key_secret = line.split('=', 1)[1].strip().strip("'")
        
        if access_key_id and access_key_secret:
            print("✅ 从 .env 文件读取凭证")
            return access_key_id, access_key_secret
    
    return None, None

def main():
    # 获取凭证
    access_key_id, access_key_secret = get_credentials()
    
    if not access_key_id or not access_key_secret:
        print("❌ 未找到 OSS 凭证")
        print("\n请通过以下任一方式提供凭证:")
        print("\n方式 1 - 环境变量(推荐):")
        print("  export OSS_ACCESS_KEY_ID='your-access-key-id'")
        print("  export OSS_ACCESS_KEY_SECRET='your-access-key-secret'")
        print("\n方式 2 - 添加到 .env 文件:")
        print("  export OSS_ACCESS_KEY_ID='your-access-key-id'")
        print("  export OSS_ACCESS_KEY_SECRET='your-access-key-secret'")
        print("\n方式 3 - 直接输入(临时):")
        
        try:
            access_key_id = input("\n请输入 AccessKey ID: ").strip()
            access_key_secret = input("请输入 AccessKey Secret: ").strip()
        except EOFError:
            print("\n❌ 无法交互式输入,请使用环境变量方式")
            sys.exit(1)
        
        if not access_key_id or not access_key_secret:
            print("❌ 凭证不能为空")
            sys.exit(1)
    
    # 配置
    bucket_name = 'lemondrop-oss-test'
    region = 'cn-hangzhou'
    endpoint = f'https://oss-{region}.aliyuncs.com'
    local_file = '/Users/yibo/Documents/LemonAI/multi-agent-system/skills/yipin_buyi_chapter_1_output.md'
    object_key = 'novels/yipin_buyi_chapter_1_output.md'
    
    # 检查本地文件
    if not os.path.exists(local_file):
        print(f"❌ 错误: 本地文件不存在: {local_file}")
        sys.exit(1)
    
    file_size = os.path.getsize(local_file)
    print(f"\n📄 准备上传文件: {local_file}")
    print(f"   文件大小: {file_size} bytes ({file_size/1024:.2f} KB)")
    print(f"   目标 Bucket: {bucket_name}")
    print(f"   目标路径: {object_key}")
    print()
    
    try:
        # 初始化认证和 Bucket
        print("🔐 正在初始化 OSS 客户端...")
        auth = oss2.Auth(access_key_id, access_key_secret)
        bucket = oss2.Bucket(
            auth, 
            endpoint, 
            bucket_name,
            region=region,
            connect_timeout=30,
            read_timeout=60
        )
        
        # 上传文件
        print("⬆️ 正在上传文件...")
        result = bucket.put_object_from_file(object_key, local_file)
        print(f"✅ 文件上传成功!")
        print(f"   ETag: {result.etag}")
        print()
        
        # 设置公共读权限
        print("🔓 设置 ACL 为公共读...")
        bucket.put_object_acl(object_key, oss2.OBJECT_ACL_PUBLIC_READ)
        print("✅ ACL 设置成功!")
        print()
        
        # 生成访问 URL
        url = f'https://{bucket_name}.oss-{region}.aliyuncs.com/{object_key}'
        print("="*60)
        print("📦 上传完成!")
        print("="*60)
        print(f"🌐 访问 URL: {url}")
        print(f"📁 Object Key: {object_key}")
        print(f"📊 文件大小: {file_size} bytes")
        print("="*60)
        
        return url
        
    except oss2.exceptions.NoSuchBucket as e:
        print(f"❌ 错误: Bucket 不存在 - {bucket_name}")
        print(f"   Request ID: {e.request_id}")
        sys.exit(1)
    except oss2.exceptions.AccessDenied as e:
        print(f"❌ 错误: 访问被拒绝,请检查凭证权限")
        print(f"   Request ID: {e.request_id}")
        sys.exit(1)
    except oss2.exceptions.OssError as e:
        print(f"❌ OSS 错误: {e}")
        sys.exit(1)
    except Exception as e:
        print(f"❌ 错误: {e}")
        sys.exit(1)

if __name__ == '__main__':
    main()