""" 파일 관련 유틸리티 함수 """ from pathlib import Path from typing import Optional from werkzeug.utils import secure_filename from app.core.config import Config from app.core.logger import get_logger logger = get_logger(__name__) def allowed_file(filename: str) -> bool: """ 파일 확장자가 허용된 확장자인지 확인 Args: filename: 파일명 Returns: 허용된 확장자면 True, 아니면 False """ if '.' not in filename: return False extension = filename.rsplit('.', 1)[1].lower() return extension in Config.ALLOWED_EXTENSIONS def get_file_extension(filename: str) -> Optional[str]: """ 파일 확장자 추출 Args: filename: 파일명 Returns: 확장자 (점 제외), 없으면 None """ if '.' not in filename: return None return filename.rsplit('.', 1)[1].lower() def ensure_upload_folder() -> Path: """ 업로드 폴더가 존재하는지 확인하고 없으면 생성 Returns: 업로드 폴더 경로 Raises: OSError: 폴더 생성 또는 쓰기 권한 오류 """ upload_folder = Config.UPLOAD_FOLDER try: # 폴더 생성 upload_folder.mkdir(parents=True, exist_ok=True) logger.debug(f"업로드 폴더 확인 완료: {upload_folder}") # 쓰기 권한 테스트 test_file = upload_folder / '.write_test' try: test_file.write_text('test') test_file.unlink() logger.debug(f"업로드 폴더 쓰기 권한 확인 완료: {upload_folder}") except PermissionError as e: raise OSError(f'업로드 폴더에 쓰기 권한이 없습니다: {upload_folder}') from e except Exception as e: raise OSError(f'업로드 폴더 쓰기 테스트 실패: {upload_folder}') from e return upload_folder except Exception as e: logger.error(f"업로드 폴더 생성 오류: {e}", exc_info=True) raise