upload_tos.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. """
  2. 上传服务模块
  3. 处理图像上传到TOS云存储
  4. """
  5. from datetime import datetime
  6. import io
  7. import os
  8. from PIL import Image
  9. import PIL
  10. import requests
  11. import tos
  12. from logger_setup import logger
  13. table_name="ai_video_info"
  14. # 从环境变量获取 AK 和 SK 信息
  15. ak ='AKLTNDNlMTFlNzk4OTNmNGU1YTlhMzQ0MmJjZjViMzc0YzQ'
  16. sk = 'T0dReU1USm1PVEkzT0RSa05EY3hZamt6Wm1SalpqUmlOamhqTnpZMVlUVQ=='
  17. # 存储桶配置信息
  18. endpoint = "https://tos-cn-guangzhou.volces.com"
  19. region = "cn-guangzhou"
  20. bucket_name = "guide-material"
  21. def upload_image(image):
  22. try:
  23. if isinstance(image,str):
  24. if image.startswith("http"):
  25. temp_img = requests.get(image, timeout=30)
  26. temp_img.raise_for_status()
  27. temp_img = Image.open(io.BytesIO(temp_img.content)).convert("RGB")
  28. else:
  29. temp_img = Image.open(image).convert("RGB")
  30. image_url=process_cropped_upload(temp_img)
  31. elif isinstance(image, Image.Image):
  32. image_url=process_cropped_upload(image)
  33. logger.info(f'上传图片成功: {image_url}')
  34. return image_url
  35. except Exception as e:
  36. error_msg = f'上传失败,未知错误: {str(e)}'
  37. raise Exception(error_msg)
  38. def process_cropped_upload(pil_image) :
  39. # 保存到 temp(时间戳命名)
  40. timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
  41. filename = f"cropped_{timestamp}.png"
  42. temp_dir = os.path.join(os.path.dirname(__file__), "temp")
  43. os.makedirs(temp_dir, exist_ok=True)
  44. local_path = os.path.join(temp_dir, filename)
  45. pil_image.save(local_path, format="PNG")
  46. # 上传到 TOS,成功后删除临时文件并替换最终链接
  47. uploaded_url = upload_file_to_tos(local_path)
  48. if uploaded_url:
  49. # try:
  50. # os.remove(local_path)
  51. # logger.info(f"已上传并删除裁剪后的临时文件: {local_path}")
  52. # except Exception as del_err:
  53. # logger.warning(f"删除临时文件失败: {del_err}")
  54. return uploaded_url
  55. else:
  56. logger.warning(f"TOS 上传失败,保留临时文件: {local_path}")
  57. return ''
  58. def upload_file_to_tos(file_path: str, dir_path="design_image") -> str:
  59. """上传文件到TOS云存储"""
  60. try:
  61. # 从文件路径中提取文件名作为object_key
  62. object_key = dir_path+'/'+os.path.basename(file_path)
  63. logger.info(f'开始上传文件: {file_path}')
  64. logger.info(f'文件将保存为: {object_key}')
  65. # 创建客户端并上传文件
  66. client = tos.TosClientV2(ak, sk, endpoint, region)
  67. client.put_object_from_file(bucket_name, object_key, file_path)
  68. # 生成访问URL
  69. # object_url = f"https://{bucket_name}.{endpoint.split('//')[1]}/{object_key}"
  70. object_url = f"https://testdgxcx-oss.gloria.com.cn/{object_key}"
  71. logger.info(f'文件上传成功,访问URL: {object_url}')
  72. return object_url
  73. except tos.exceptions.TosClientError as e:
  74. error_msg = f'上传失败,客户端错误: message={e.message}, cause={e.cause}'
  75. logger.error(error_msg)
  76. raise Exception(error_msg)
  77. except tos.exceptions.TosServerError as e:
  78. error_msg = f'上传失败,服务端错误: code={e.code}, request_id={e.request_id}, message={e.message}, status_code={e.status_code}, ec={e.ec}, request_url={e.request_url}'
  79. logger.error(error_msg)
  80. raise Exception(error_msg)
  81. except Exception as e:
  82. error_msg = f'上传失败,未知错误: {str(e)}'
  83. logger.error(error_msg)
  84. raise Exception(error_msg)
  85. if __name__=="__main__":
  86. upload_file_to_tos(file_path=r"D:\AI模特流程\历史.xlsx")