upload.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import os
  2. import tos
  3. from dotenv import load_dotenv
  4. from utils.logger_config import setup_logger
  5. logger = setup_logger(__name__)
  6. # 加载环境变量
  7. load_dotenv()
  8. # 从环境变量获取 AK 和 SK 信息
  9. ak = os.getenv('TOS_ACCESS_KEY')
  10. sk = os.getenv('TOS_SECRET_KEY')
  11. # 存储桶配置信息
  12. endpoint = "https://tos-cn-guangzhou.volces.com"
  13. region = "cn-guangzhou"
  14. bucket_name = "guide-material"
  15. def upload_file_to_tos(file_name: str) -> str:
  16. """
  17. 上传文件到TOS存储桶并返回访问URL
  18. Args:
  19. file_name (str): 本地文件的完整路径
  20. Returns:
  21. str: 上传文件的访问URL
  22. Raises:
  23. Exception: 上传过程中的任何错误
  24. """
  25. try:
  26. # 检查文件是否存在
  27. if not os.path.exists(file_name):
  28. raise FileNotFoundError(f"文件不存在: {file_name}")
  29. # 从文件路径中提取文件名作为object_key,确保使用正斜杠
  30. filename = os.path.basename(file_name)
  31. object_key = f"video-create/{filename}".replace("\\", "/")
  32. logger.info(f'开始上传文件: {file_name}')
  33. logger.info(f'文件将保存为: {object_key}')
  34. # 创建客户端并上传文件
  35. client = tos.TosClientV2(ak, sk, endpoint, region)
  36. client.put_object_from_file(bucket_name, object_key, file_name)
  37. # 验证上传是否成功 - 尝试获取对象元数据
  38. try:
  39. head_response = client.head_object(bucket_name, object_key)
  40. if head_response is None:
  41. raise Exception("无法验证文件是否上传成功:head_object返回None")
  42. logger.info(f'文件上传验证成功,ETag: {getattr(head_response, "etag", "N/A")}')
  43. except Exception as verify_error:
  44. logger.warning(f'验证上传状态时出现警告: {str(verify_error)}')
  45. # 不抛出异常,因为上传可能已经成功,只是验证失败
  46. # 生成访问URL,确保object_key使用正斜杠
  47. object_key_normalized = object_key.replace("\\", "/")
  48. object_url = f"https://testdgxcx-oss.gloria.com.cn/{object_key_normalized}"
  49. logger.info(f'文件上传成功,访问URL: {object_url}')
  50. logger.info(f'Object Key (用于调试): {object_key_normalized}')
  51. return object_url
  52. except tos.exceptions.TosClientError as e:
  53. error_msg = f'上传失败,客户端错误: message={e.message}, cause={e.cause}'
  54. logger.error(error_msg)
  55. raise Exception(error_msg)
  56. except tos.exceptions.TosServerError as e:
  57. 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}'
  58. logger.error(error_msg)
  59. raise Exception(error_msg)
  60. except Exception as e:
  61. error_msg = f'上传失败,未知错误: {str(e)}'
  62. logger.error(error_msg)
  63. raise Exception(error_msg)
  64. # 使用示例
  65. if __name__ == "__main__":
  66. # python -m utils.upload
  67. test_file = "./output/new_frame_scene0_camera0_shot1.png"
  68. # test_file = "/data/data/luosy/project/iclip/output/rawvideo/rawvideo_a/oral_show/final-final-rawvideo-0-0.mp4"
  69. #
  70. # test_file = "010.jpg"
  71. try:
  72. url = upload_file_to_tos(test_file)
  73. print(f"文件上传成功,访问URL: {url}")
  74. except Exception as e:
  75. print(f"上传失败: {str(e)}")