1515import os
1616from veadk .config import getenv
1717from veadk .utils .logger import get_logger
18- import tos
1918import asyncio
2019from typing import Union
2120from pydantic import BaseModel , Field
2221from typing import Any
2322from urllib .parse import urlparse
2423from datetime import datetime
2524
25+ # Initialize logger before using it
2626logger = get_logger (__name__ )
2727
28+ # Try to import tos module, and provide helpful error message if it fails
29+ try :
30+ import tos
31+ except ImportError as e :
32+ logger .error (
33+ "Failed to import 'tos' module. Please install it using: pip install tos\n "
34+ )
35+ raise ImportError (
36+ "Missing 'tos' module. Please install it using: pip install tos\n "
37+ ) from e
38+
2839
2940class TOSConfig (BaseModel ):
3041 region : str = Field (
@@ -59,10 +70,13 @@ def model_post_init(self, __context: Any) -> None:
5970 logger .info ("Connected to TOS successfully." )
6071 except Exception as e :
6172 logger .error (f"Client initialization failed:{ e } " )
62- return None
73+ self . _client = None
6374
6475 def create_bucket (self ) -> bool :
6576 """If the bucket does not exist, create it"""
77+ if not self ._client :
78+ logger .error ("TOS client is not initialized" )
79+ return False
6680 try :
6781 self ._client .head_bucket (self .config .bucket_name )
6882 logger .info (f"Bucket { self .config .bucket_name } already exists" )
@@ -76,6 +90,9 @@ def create_bucket(self) -> bool:
7690 )
7791 logger .info (f"Bucket { self .config .bucket_name } created successfully" )
7892 return True
93+ else :
94+ logger .error (f"Bucket creation failed: { str (e )} " )
95+ return False
7996 except Exception as e :
8097 logger .error (f"Bucket creation failed: { str (e )} " )
8198 return False
@@ -103,26 +120,24 @@ def upload(
103120 data : Union [str , bytes ],
104121 ):
105122 if isinstance (data , str ):
106- data_type = "file"
123+ # data is a file path
124+ return asyncio .to_thread (self ._do_upload_file , object_key , data )
107125 elif isinstance (data , bytes ):
108- data_type = "bytes"
126+ # data is bytes content
127+ return asyncio .to_thread (self ._do_upload_bytes , object_key , data )
109128 else :
110129 error_msg = f"Upload failed: data type error. Only str (file path) and bytes are supported, got { type (data )} "
111130 logger .error (error_msg )
112131 raise ValueError (error_msg )
113- if data_type == "file" :
114- return asyncio .to_thread (self ._do_upload_file , object_key , data )
115- elif data_type == "bytes" :
116- return asyncio .to_thread (self ._do_upload_bytes , object_key , data )
117132
118- def _do_upload_bytes (self , object_key : str , bytes : bytes ) -> bool :
133+ def _do_upload_bytes (self , object_key : str , data : bytes ) -> bool :
119134 try :
120135 if not self ._client :
121136 return False
122137 if not self .create_bucket ():
123138 return False
124139 self ._client .put_object (
125- bucket = self .config .bucket_name , key = object_key , content = bytes
140+ bucket = self .config .bucket_name , key = object_key , content = data
126141 )
127142 logger .debug (f"Upload success, object_key: { object_key } " )
128143 self ._close ()
@@ -152,6 +167,9 @@ def _do_upload_file(self, object_key: str, file_path: str) -> bool:
152167
153168 def download (self , object_key : str , save_path : str ) -> bool :
154169 """download image from TOS"""
170+ if not self ._client :
171+ logger .error ("TOS client is not initialized" )
172+ return False
155173 try :
156174 object_stream = self ._client .get_object (self .config .bucket_name , object_key )
157175
0 commit comments