| 1234567891011121314151617181920212223242526272829303132333435 |
- """模型文件:列举与安全解析。"""
- 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")
|