Spaces:
Sleeping
Sleeping
| """ | |
| 檔案處理工具模組 | |
| """ | |
| 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 | |