Visione: immagini BMP rifiutate (File type image/bmp not allowed) #99

Closed
opened 2026-10-25 14:37:34 +00:00 by Adriano · 2 comments
Owner

src/backend/api/routers/vision.py:86 _read_image accetta solo ALLOWED_IMAGE_TYPES di files.py (jpeg, png, gif, webp). Input: foto Sider/Menoncin BMP 2464x2056 caricata nel wizard «Crea ricetta da DXF» (e in execute/check/preview/reference-images, stesso _read_image) → 400 «File type image/bmp not allowed. Must be an image.». Il worker decodifica BMP (commento a vision.py:46-50) e le foto dei banchi Opto sono BMP. Adriano 25/10/2026.

src/backend/api/routers/vision.py:86 _read_image accetta solo ALLOWED_IMAGE_TYPES di files.py (jpeg, png, gif, webp). Input: foto Sider/Menoncin BMP 2464x2056 caricata nel wizard «Crea ricetta da DXF» (e in execute/check/preview/reference-images, stesso _read_image) → 400 «File type image/bmp not allowed. Must be an image.». Il worker decodifica BMP (commento a vision.py:46-50) e le foto dei banchi Opto sono BMP. Adriano 25/10/2026.
Adriano added the bug label 2026-10-25 14:37:34 +00:00
Author
Owner

ANALISI #99 (Opus)
RIF: gitea:Adriano/TieMeasureFlow#99, base ramo lavoro/daitarn-tmf-dxfcal 4b1b23c
COSA: le rotte visione accettano BMP. Solo il router visione: files.py (allegati, serviti per estensione) NON cambia.
FILE: src/backend/api/routers/vision.py

  1. Nuova costante _VISION_IMAGE_TYPES = ALLOWED_IMAGE_TYPES | {"image/bmp", "image/x-ms-bmp"} (commento #99: le camere dei banchi Opto salvano BMP, il worker le decodifica).
  2. _read_image: controllo su _VISION_IMAGE_TYPES invece di ALLOWED_IMAGE_TYPES. La firma magic bytes BM c'e' gia' in _IMAGE_SIGNATURES.
  3. _IMAGE_EXTENSIONS: aggiungere "image/bmp": "bmp", "image/x-ms-bmp": "bmp" (usato da execute riga ~147 per salvare l'immagine del risultato e da reference-images riga ~313, che fa KeyError senza).
  4. Aggiornare il commento sopra _IMAGE_SIGNATURES (ora BMP e' anche nella lista ammessa; TIFF resta fuori: i browser non lo mostrano nel risultato).
  5. Se ALLOWED_IMAGE_TYPES non e' piu' usato in vision.py, togliere l'import (non toccare files.py).
    TEST (src/backend/tests, file nuovo test_vision_bmp.py o accanto ai test di _read_image esistenti — cerca "not allowed" nei test):
  • POST /api/vision/check o /api/vision/preview con un BMP vero (generato con PIL o bytes minimi validi) e content-type image/bmp → non 400 (worker finto come negli altri test visione).
  • image/x-ms-bmp accettato.
  • image/tiff ancora 400.
  • un file testo dichiarato image/bmp → 422 (firma).
  • reference-images con BMP salva estensione .bmp.
    NON TOCCARE: src/backend/api/routers/files.py, settings.py, frontend, src/vision_worker.
ANALISI #99 (Opus) RIF: gitea:Adriano/TieMeasureFlow#99, base ramo lavoro/daitarn-tmf-dxfcal 4b1b23c COSA: le rotte visione accettano BMP. Solo il router visione: files.py (allegati, serviti per estensione) NON cambia. FILE: src/backend/api/routers/vision.py 1. Nuova costante `_VISION_IMAGE_TYPES = ALLOWED_IMAGE_TYPES | {"image/bmp", "image/x-ms-bmp"}` (commento #99: le camere dei banchi Opto salvano BMP, il worker le decodifica). 2. `_read_image`: controllo su `_VISION_IMAGE_TYPES` invece di `ALLOWED_IMAGE_TYPES`. La firma magic bytes `BM` c'e' gia' in `_IMAGE_SIGNATURES`. 3. `_IMAGE_EXTENSIONS`: aggiungere "image/bmp": "bmp", "image/x-ms-bmp": "bmp" (usato da execute riga ~147 per salvare l'immagine del risultato e da reference-images riga ~313, che fa KeyError senza). 4. Aggiornare il commento sopra `_IMAGE_SIGNATURES` (ora BMP e' anche nella lista ammessa; TIFF resta fuori: i browser non lo mostrano nel risultato). 5. Se `ALLOWED_IMAGE_TYPES` non e' piu' usato in vision.py, togliere l'import (non toccare files.py). TEST (src/backend/tests, file nuovo test_vision_bmp.py o accanto ai test di _read_image esistenti — cerca "not allowed" nei test): - POST /api/vision/check o /api/vision/preview con un BMP vero (generato con PIL o bytes minimi validi) e content-type image/bmp → non 400 (worker finto come negli altri test visione). - image/x-ms-bmp accettato. - image/tiff ancora 400. - un file testo dichiarato image/bmp → 422 (firma). - reference-images con BMP salva estensione .bmp. NON TOCCARE: src/backend/api/routers/files.py, settings.py, frontend, src/vision_worker.
Author
Owner

Soluzione

ESITO: fatto
FILE: src/backend/api/routers/vision.py — _VISION_IMAGE_TYPES = ALLOWED_IMAGE_TYPES | {image/bmp, image/x-ms-bmp} usato in _read_image; bmp in _IMAGE_EXTENSIONS (reference-images salva .bmp). files.py invariato.
TEST: src/backend/tests/test_vision_bmp.py (5).
COMMIT: 444dc0a, merge b78f242 su lavoro/daitarn-tmf-dxfcal (pushato).
PROVA: pytest test_vision_bmp.py → 5 passed; test_vision*.py → 89 passed (Sonnet); TMF daitarn riavviato 15:48, POST /api/vision/tasks/8/recipe/dxf-compare con sider_2_1.bmp (image/bmp) + MEVIS dxf, px_per_mm 71.11, save=false → HTTP 200.

**Soluzione** ESITO: fatto FILE: src/backend/api/routers/vision.py — _VISION_IMAGE_TYPES = ALLOWED_IMAGE_TYPES | {image/bmp, image/x-ms-bmp} usato in _read_image; bmp in _IMAGE_EXTENSIONS (reference-images salva .bmp). files.py invariato. TEST: src/backend/tests/test_vision_bmp.py (5). COMMIT: 444dc0a, merge b78f242 su lavoro/daitarn-tmf-dxfcal (pushato). PROVA: pytest test_vision_bmp.py → 5 passed; test_vision*.py → 89 passed (Sonnet); TMF daitarn riavviato 15:48, POST /api/vision/tasks/8/recipe/dxf-compare con sider_2_1.bmp (image/bmp) + MEVIS dxf, px_per_mm 71.11, save=false → HTTP 200.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#99