@@ -102,6 +102,51 @@ def file_exists(self, object_name: str) -> bool:
102102 logger .error (f"Error checking file existence for { object_name } : { str (e )} " )
103103 return False
104104
105+ def download_file (self , object_name : str ) -> Optional [bytes ]:
106+ """Download file from storage"""
107+ try :
108+ client = self .get_client ()
109+ response = client .get_object (self .bucket_name , object_name )
110+ return response .read ()
111+ except S3Error as e :
112+ logger .error (f"File not found in storage: { object_name } " )
113+ return None
114+ except Exception as e :
115+ logger .error (f"Error downloading file { object_name } : { str (e )} " )
116+ return None
117+
118+ def delete_file (self , object_name : str ) -> bool :
119+ """Delete file from storage"""
120+ try :
121+ client = self .get_client ()
122+ client .remove_object (self .bucket_name , object_name )
123+ logger .info (f"Deleted file: { object_name } " )
124+ return True
125+ except S3Error as e :
126+ logger .error (f"File not found for deletion: { object_name } " )
127+ return False
128+ except Exception as e :
129+ logger .error (f"Error deleting file { object_name } : { str (e )} " )
130+ return False
131+
132+ def get_file_info (self , object_name : str ) -> Optional [Dict [str , Any ]]:
133+ """Get file information (size, last modified, etc.)"""
134+ try :
135+ client = self .get_client ()
136+ stat = client .stat_object (self .bucket_name , object_name )
137+ return {
138+ "size" : stat .size ,
139+ "last_modified" : stat .last_modified ,
140+ "etag" : stat .etag ,
141+ "content_type" : stat .content_type ,
142+ }
143+ except S3Error as e :
144+ logger .error (f"File not found: { object_name } " )
145+ return None
146+ except Exception as e :
147+ logger .error (f"Error getting file info for { object_name } : { str (e )} " )
148+ return None
149+
105150
106151# Global storage service instance
107152storage_service = StorageService ()
0 commit comments