From e543809bc226359ba697c0eecdc5d0de776388e8 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Thu, 21 Aug 2025 09:16:43 +0800 Subject: [PATCH] 'commit' --- dsLightRag/JiMeng/T1_JmTxt2Img.py | 51 +++++++----- dsLightRag/Util/ObsUtil.py | 77 +++++++++++++++++- .../Util/__pycache__/ObsUtil.cpython-310.pyc | Bin 2215 -> 3810 bytes 3 files changed, 106 insertions(+), 22 deletions(-) diff --git a/dsLightRag/JiMeng/T1_JmTxt2Img.py b/dsLightRag/JiMeng/T1_JmTxt2Img.py index a6c337ce..8ecb48fa 100644 --- a/dsLightRag/JiMeng/T1_JmTxt2Img.py +++ b/dsLightRag/JiMeng/T1_JmTxt2Img.py @@ -1,22 +1,39 @@ import base64 import json +import logging import os +import uuid -from Config.Config import OBS_SERVER, OBS_PREFIX +from Config.Config import OBS_SERVER, OBS_PREFIX, OBS_BUCKET from JiMeng.Kit.JmCommon import JmCommon from JiMeng.Kit.JmErrorCode import JmErrorCode from Util.ObsUtil import ObsUploader +# 设置日志 +logger = logging.getLogger(__name__) +logger.level = logging.INFO + +# 添加控制台处理器 +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.INFO) + +# 设置日志格式 +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +console_handler.setFormatter(formatter) + +# 将处理器添加到logger +logger.addHandler(console_handler) class JmTxt2Img: action = "CVProcess" # V2.1 req_key = "jimeng_high_aes_general_v21_L" + # V3.0 # req_key="jimeng_t2i_v30" @staticmethod - def generate_image(prompt, save_img_path): + def generate_image(prompt): """生成图片""" # 创建请求体 req = { @@ -37,48 +54,40 @@ class JmTxt2Img: # 获取图片Base64数据 img_base64 = jo.get("data", {}).get("binary_data_base64", [""])[0] - # 确保目录存在 - os.makedirs(os.path.dirname(save_img_path), exist_ok=True) - - # 对 Base64 字符串进行解码并保存为文件 try: # 注意:有些Base64字符串可能有前缀,需要去除 if img_base64.startswith('data:image'): img_base64 = img_base64.split(',')[1] bytes_data = base64.b64decode(img_base64) - with open(save_img_path, 'wb') as f: - f.write(bytes_data) - print(f"文件保存成功!文件位置: {save_img_path}") # 创建上传器实例 uploader = ObsUploader() + + # 生成一个随机的图片文件名 + jpg_file_name = f"{str(uuid.uuid4())}.jpg" # 上传参数 - object_key = OBS_PREFIX + "/" + file_path + object_key = OBS_PREFIX + "/JiMeng/" + jpg_file_name # 执行上传 - success, result = uploader.upload_file(object_key, file_path) + success, result = uploader.upload_base64_image(object_key, bytes_data) # 处理结果 if success: - logger.info(f'{file_path}上传成功!') + logger.info(f'{jpg_file_name}上传成功!') # 获取上传文件的 URL file_url = f"https://{OBS_BUCKET}.{OBS_SERVER}/{object_key}" - img_url_list.append(file_url) + return file_url except Exception as e: print(f"保存图片失败: {str(e)}") raise Exception(f"保存图片失败: {str(e)}") - - + return None @staticmethod def main(): - # 示例提示词 prompt = "雨天街头,一位头戴黄色安全帽、身穿荧光黄安全背心与棕色外套、搭配蓝色牛仔裤和棕色工装靴的中国工人,背着一个中国小女孩。工人脖子上侧挂一个小熊玩偶包,拖住小女孩臀部的手同时挂着一袋小熊饼干。小女孩双手搂着工人的脖子。小女孩穿红色雨衣,戴红色雨衣帽。两个人露出微笑。背景是居民楼和树木,地面潮湿,氛围温馨。" - # 保存图片路径 - save_image_path = r"D:\Text2Img.jpg" - JmTxt2Img.generate_image(prompt, save_image_path) - print(f"保存图片路径:{save_image_path}") + url = JmTxt2Img.generate_image(prompt) + logger.info(f"图片URL: {url}") if __name__ == "__main__": - JmTxt2Img.main() \ No newline at end of file + JmTxt2Img.main() diff --git a/dsLightRag/Util/ObsUtil.py b/dsLightRag/Util/ObsUtil.py index 731996ae..7183e0e8 100644 --- a/dsLightRag/Util/ObsUtil.py +++ b/dsLightRag/Util/ObsUtil.py @@ -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()} diff --git a/dsLightRag/Util/__pycache__/ObsUtil.cpython-310.pyc b/dsLightRag/Util/__pycache__/ObsUtil.cpython-310.pyc index 7409504a63d64af313572e124b0fc533d8981ea9..c248e360065ea83794b61f146c7ef19f4492d3f1 100644 GIT binary patch delta 1816 zcmah}TaOe)6t1ei_w3BxZ^F7G0y@G153s>`Kvcl!3mPCuzf5MPdY74<%UV+-?54*N zmMEZz*Z~uF4YOV#BxqEO+2E=_!S{|&y2HYYKL8WsIX$}w2DLi<^{I2d`s!3w*SXsH z>rkv5joJj-oVarI{J@3STF#-z38w|(w7%4#VV^k+zO0}WRY#>5Q^3|7Ewt5wUNjt| zXgX%ma;&25*p#@m5pmn*sS|yHaEH(6lg2?_%<JY&%=9TH=Urg!@th*n&MH9`D>KHD4Qi*^%OwOqc@&aUS{-;|ADr#|87LMuT|ZO ze32*PcXd~$$CL4c*ZiNgJ@#ECJ`&$|O%Z+mkiLUn^AG6H)catLK+Tl-l;{Uj3?K|5 ztVI|?7zPNey~nfeq|B8|fl`q|#L;Pwl|?ZvQ||F>!V=NYRnFwytV~U~Q;s#3E4Zo2 zv^*L_GS%#aD^sO((GAQZB*xP+9r&HbPCDejWK7hvIt*WJ5isz;aSJLpDIwF>J=pOo z5k`*GR8I@-m?Sf#rb*Zq$!3@so$mKo15RX~)^x6T`s+lj_wKZ88dixkrgl&QPn~$IW*i}<-eW|X9-H}FV(-66cqDJ-Z4b}I@GvRuoK`bEGaupl z1QBOsTO-Pi@SIGK&XSMSc}hv>wSW}^52V`i)VU3=_I$^xlSh!!@`czLVi#|lQ^(k0 za)9tCc)H;yKvoaR*DMh4^{f@qUjD!|yd8MR?M6QDm{VFhunT=t^eD8Ae>N`s}-@X0QZ1ePYEB=dL-8%QB ze@OLS&4dF}_yZ;552~z)G{5+8`TCWmg>Qa)^90zp&z@}l@JVy={Qrpmu6|md)~a%B zWaqTenq~7HNSq{;z{r+M(k)5x6!gU=gie4e-kMg1tySGR{eJW8qu()hDZRe|Uq% zW9VIn@Hhfi3b7vHKMRG}fRs4G699=wSQf;SU^|ifPEI6{a&I%8Xe(AvL2=2I#vMCX zOpm+aA&bpO9YNTF5W5HMU7gCbp6#JG(cUVhMxi`D4ht8f!07z4!n~lvZ4zRolxJDN3@739;jJ?MM(s zT!_R4Rf0WoY1Km?fOp^tdh)62Q}oz%JJNjf%}D#x{(kaf(N8_kLAw6buTL88jo&&t z(i=w{V#NMWV4!y#P-1tojCVlhZlk z^b#}g=1UY3oxh_yd#WK&8O|^Vj^~IGPPxI&IWU8h_b9Lm_pq0J9LH&w3wi$u<^Ye> zFMMjk49|!^iqBXdJSznCvK{_f(mP^^Z zwd!kbZ_*!%yff-1qHxmQsp#jOp*Sxp$AegO#@+lxh1M>#)P*&q0X{egO!d=yMi<@we!vzR1VwyZ^jazOliEDy~8UJETVb E0-DBaJOBUy