"""模型文件:列举与安全解析。""" from pathlib import Path from config import MODELS_DIR ALLOWED_SUFFIXES = {".glb", ".gltf"} MEDIA_TYPES = {".glb": "model/gltf-binary", ".gltf": "model/gltf+json"} def list_models() -> list[str]: if not MODELS_DIR.is_dir(): return [] names = [ path.name for path in MODELS_DIR.iterdir() if path.is_file() and path.suffix.lower() in ALLOWED_SUFFIXES ] return sorted(names) def resolve_model(name: str) -> Path | None: """只允许 models 目录下的直接子文件,防路径穿越。""" if not name or name != Path(name).name: return None candidate = (MODELS_DIR / name).resolve() if candidate.parent != MODELS_DIR.resolve(): return None if candidate.is_file() and candidate.suffix.lower() in ALLOWED_SUFFIXES: return candidate return None def media_type(path: Path) -> str: return MEDIA_TYPES.get(path.suffix.lower(), "application/octet-stream")