SOY NV AI
λ©νλ°μ΄ν° μμ± κΈ°λ₯ κ°μ : κΈ°μ‘΄ λ©νλ°μ΄ν° λ³ν© λ° νμ°¨ μ 보 μ μ§
d234e06
| """ | |
| νμΌ κ΄λ ¨ μ νΈλ¦¬ν° ν¨μ | |
| """ | |
| 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 | |