fix(vision): limite di tipo e dimensione sui tre endpoint di upload

/execute, /preview e /reference-images leggevano l'immagine senza
limite di tipo o dimensione, e /reference-images scriveva su disco con
estensione .png fissa qualunque fosse il tipo reale. Riusa la
convenzione già esistente in files.py (ALLOWED_IMAGE_TYPES,
validate_file_size) invece di inventarne una seconda: tipo controllato
dall'header prima di leggere, dimensione controllata sul corpo letto,
un PDF non è qualcosa che un grafo di visione può misurare.
save_reference_image ora scrive con l'estensione del tipo reale
dell'upload.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BBnuACZSCJqXrMYC3LUMU
This commit is contained in:
2026-08-16 19:41:14 +02:00
parent 38ef0587f5
commit 0bd95367bb
3 changed files with 220 additions and 5 deletions
+8 -2
View File
@@ -195,13 +195,19 @@ async def save_reference_image(
station_id: int | None = None,
device_code: str | None = None,
calibration_snapshot: dict | None = None,
extension: str = "png",
) -> VisionReferenceImage:
"""Keep an image so the graph can be composed and re-tried without a camera."""
"""Keep an image so the graph can be composed and re-tried without a camera.
`extension` must match the upload's real content type (the router derives
it from `image.content_type`) - writing a jpeg to disk as `<uuid>.png`
would be a lie the filename tells forever.
"""
# `upload_path` is the resolved Path, `upload_dir` the bare setting: the
# rest of the codebase uses the former (see production_export_service).
folder = settings.upload_path / "vision" / "reference" / str(task_id)
folder.mkdir(parents=True, exist_ok=True)
name = f"{uuid4().hex}.png"
name = f"{uuid4().hex}.{extension}"
(folder / name).write_bytes(image_bytes)
reference = VisionReferenceImage(