""" 檔案處理工具模組 """ import os import shutil import tempfile from typing import Optional, List import logging logger = logging.getLogger(__name__) class FileHandler: """檔案處理工具類別""" def __init__(self, temp_dir: str = "temp", output_dir: str = "output"): self.temp_dir = temp_dir self.output_dir = output_dir self._ensure_directories() def _ensure_directories(self): """確保必要目錄存在""" for directory in [self.temp_dir, self.output_dir]: os.makedirs(directory, exist_ok=True) def save_uploaded_file(self, file_path: str, file_type: str = "unknown") -> str: """ 儲存上傳的檔案到臨時目錄 Args: file_path: 原始檔案路徑 file_type: 檔案類型 (image, video, audio, etc.) Returns: 新的檔案路徑 """ try: # 生成新的檔案名 filename = os.path.basename(file_path) name, ext = os.path.splitext(filename) # 創建臨時檔案 temp_file = tempfile.NamedTemporaryFile( delete=False, suffix=ext, dir=self.temp_dir, prefix=f"{file_type}_" ) temp_path = temp_file.name temp_file.close() # 複製檔案 shutil.copy2(file_path, temp_path) logger.info(f"檔案已儲存到: {temp_path}") return temp_path except Exception as e: logger.error(f"儲存檔案失敗: {e}") raise def cleanup_temp_files(self, file_paths: List[str]): """清理臨時檔案""" for file_path in file_paths: try: if os.path.exists(file_path): os.remove(file_path) logger.info(f"已刪除臨時檔案: {file_path}") except Exception as e: logger.error(f"刪除檔案失敗: {e}") def get_file_info(self, file_path: str) -> dict: """獲取檔案資訊""" try: stat = os.stat(file_path) return { "size": stat.st_size, "modified": stat.st_mtime, "extension": os.path.splitext(file_path)[1].lower(), "basename": os.path.basename(file_path) } except Exception as e: logger.error(f"獲取檔案資訊失敗: {e}") return {} def is_valid_file_type(self, file_path: str, allowed_types: List[str]) -> bool: """檢查檔案類型是否有效""" file_info = self.get_file_info(file_path) extension = file_info.get("extension", "") return extension in allowed_types def validate_file_size(self, file_path: str, max_size: int) -> bool: """檢查檔案大小是否有效""" file_info = self.get_file_info(file_path) size = file_info.get("size", 0) return size <= max_size