geometria(); if ($geometry === null) { throw new RuntimeException('La geometria salvata per questa piantina non รจ leggibile: ridisegna il poligono.'); } $formato = config('piantine.formato') === 'png' ? 'png' : 'jpeg'; $response = Http::timeout((int) config('piantine.renderer_timeout')) ->post(rtrim((string) config('piantine.renderer_url'), '/') . '/render', [ 'geometry' => $geometry, 'marginRatio' => (float) config('piantine.margin_ratio'), 'maxSide' => (int) config('piantine.max_side'), 'aspect' => (float) config('piantine.aspetto'), 'strokeWidth' => (float) config('piantine.tratto'), 'strokeOpacity' => (float) config('piantine.tratto_opacita'), 'format' => $formato, 'quality' => (int) config('piantine.qualita'), ]); if (! $response->successful()) { $dettaglio = $response->json('error') ?? ('HTTP ' . $response->status()); throw new RuntimeException('Il renderer delle mappe ha risposto con un errore: ' . $dettaglio); } $immagine = $response->body(); if (! $this->immagineValida($immagine, $formato)) { throw new RuntimeException('Il renderer delle mappe non ha restituito un\'immagine valida.'); } // Il vecchio file puo' avere un'estensione diversa da quella nuova (si // e' passati da PNG a JPEG): senza questa rimozione resterebbe sul // volume per sempre, senza che niente lo referenzi piu'. if ($mappa->image_path && $mappa->image_path !== $this->percorso($mappa, $formato)) { Storage::disk('public')->delete($mappa->image_path); } $path = $this->percorso($mappa, $formato); Storage::disk('public')->put($path, $immagine); $mappa->update([ 'image_path' => $path, 'rendered_at' => now(), ]); return $path; } private function percorso(TerritorioMappa $mappa, string $formato): string { return 'territori-mappe/piantina-' . $mappa->id . '.' . ($formato === 'png' ? 'png' : 'jpg'); } /** I primi byte bastano a distinguere un'immagine da una pagina d'errore. */ private function immagineValida(string $dati, string $formato): bool { if ($dati === '') { return false; } return $formato === 'png' ? str_starts_with($dati, "\x89PNG") : str_starts_with($dati, "\xFF\xD8\xFF"); } }