This commit is contained in:
2025-08-21 09:16:43 +08:00
parent c577687727
commit e543809bc2
3 changed files with 106 additions and 22 deletions

View File

@@ -1,6 +1,7 @@
# pip install esdk-obs-python --trusted-host pypi.org
import traceback
import logging
import base64 # 添加base64模块导入
from obs import ObsClient
from obs import PutObjectHeader
@@ -31,7 +32,7 @@ class ObsUploader:
:param bucket_name: 桶名称
:param object_key: 对象键(上传后的文件名)
:param file_path: 本地文件路径
:param meta元数据
:param metadata: 元数据
:param headers: 请求头
:return: 成功返回True和响应信息失败返回False和错误信息
"""
@@ -76,3 +77,77 @@ class ObsUploader:
logger.error(error_msg)
logger.error(traceback.format_exc())
return False, {'error': str(e), 'traceback': traceback.format_exc()}
def upload_base64_image(self, object_key, base64_data, bucket_name=OBS_BUCKET, metadata=None, headers=None):
"""
上传Base64编码的图片或原始二进制图片数据到OBS
:param bucket_name: 桶名称
:param object_key: 对象键(上传后的文件名)
:param base64_data: Base64编码的图片字符串、字节形式或原始二进制图片数据
:param metadata: 元数据
:param headers: 请求头
:return: 成功返回True和响应信息失败返回False和错误信息
"""
try:
# 初始化默认参数
if metadata is None:
metadata = {}
if headers is None:
headers = PutObjectHeader()
# 处理数据
if isinstance(base64_data, bytes):
try:
# 尝试解码为UTF-8字符串假设是Base64编码的字符串的字节形式
base64_string = base64_data.decode('utf-8')
# 移除Base64前缀如果有
if 'base64,' in base64_string:
base64_string = base64_string.split('base64,')[1]
# 解码Base64数据
image_data = base64.b64decode(base64_string)
except UnicodeDecodeError:
# 解码失败,假设是原始二进制图片数据
image_data = base64_data
else:
# 假设是字符串
base64_string = str(base64_data)
# 移除Base64前缀如果有
if 'base64,' in base64_string:
base64_string = base64_string.split('base64,')[1]
# 解码Base64数据
image_data = base64.b64decode(base64_string)
# 执行对象上传
resp = self.obs_client.putObject(
bucket_name,
object_key,
content=image_data,
metadata=metadata,
headers=headers
)
# 检查响应状态
if resp.status < 300:
logger.info(f'图片上传成功: -> {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()}