# pip install esdk-obs-python --trusted-host pypi.org import traceback import logging from obs import ObsClient from obs import PutObjectHeader from Config.Config import OBS_AK, OBS_SK, OBS_SERVER, OBS_BUCKET # 配置日志 logger = logging.getLogger(__name__) class ObsUploader: def __init__(self, access_key_id, secret_access_key, server): """ 初始化OBS客户端 :param access_key_id: 访问密钥ID :param secret_access_key: 秘密访问密钥 :param server: OBS服务器地址 """ self.obs_client = ObsClient( access_key_id=access_key_id, secret_access_key=secret_access_key, server=server ) def upload_file(self, bucket_name, object_key, file_path, metadata=None, headers=None): """ 上传文件到OBS :param bucket_name: 桶名称 :param object_key: 对象键(上传后的文件名) :param file_path: 本地文件路径 :param meta元数据 :param headers: 请求头 :return: 成功返回True和响应信息,失败返回False和错误信息 """ try: # 初始化默认参数 if metadata is None: metadata = {} if headers is None: headers = PutObjectHeader() # 执行文件上传 resp = self.obs_client.putFile( bucket_name, object_key, file_path, metadata, headers ) # 检查响应状态 if resp.status < 300: logger.info(f'文件上传成功: {file_path} -> {bucket_name}/{object_key}') logger.info(f'requestId: {resp.requestId}') logger.info(f'etag: {resp.body.etag}') return True, { 'requestId': resp.requestId, 'etag': resp.body.etag, 'versionId': resp.body.versionId, 'storageClass': resp.body.storageClass } else: error_msg = f'文件上传失败: {resp.errorCode} - {resp.errorMessage}' logger.error(error_msg) logger.error(f'requestId: {resp.requestId}') return False, { 'requestId': resp.requestId, 'errorCode': resp.errorCode, 'errorMessage': resp.errorMessage } except Exception as e: error_msg = f'文件上传异常: {str(e)}' logger.error(error_msg) logger.error(traceback.format_exc()) return False, {'error': str(e), 'traceback': traceback.format_exc()}