motion_analyze / utils /file_handler.py
mikao007's picture
Upload 12 files
e92e423 verified
"""
檔案處理工具模組
"""
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