model_service.py 1004 B

1234567891011121314151617181920212223242526272829303132333435
  1. """模型文件:列举与安全解析。"""
  2. from pathlib import Path
  3. from config import MODELS_DIR
  4. ALLOWED_SUFFIXES = {".glb", ".gltf"}
  5. MEDIA_TYPES = {".glb": "model/gltf-binary", ".gltf": "model/gltf+json"}
  6. def list_models() -> list[str]:
  7. if not MODELS_DIR.is_dir():
  8. return []
  9. names = [
  10. path.name
  11. for path in MODELS_DIR.iterdir()
  12. if path.is_file() and path.suffix.lower() in ALLOWED_SUFFIXES
  13. ]
  14. return sorted(names)
  15. def resolve_model(name: str) -> Path | None:
  16. """只允许 models 目录下的直接子文件,防路径穿越。"""
  17. if not name or name != Path(name).name:
  18. return None
  19. candidate = (MODELS_DIR / name).resolve()
  20. if candidate.parent != MODELS_DIR.resolve():
  21. return None
  22. if candidate.is_file() and candidate.suffix.lower() in ALLOWED_SUFFIXES:
  23. return candidate
  24. return None
  25. def media_type(path: Path) -> str:
  26. return MEDIA_TYPES.get(path.suffix.lower(), "application/octet-stream")