Jak Ošetřit Prázdný nebo Neplatný Blob Obrázku v PHP

Nedávno jsem narazil na problém při zpracování obrázkových dat získaných z databáze. Hodnota obrázku byla někdy prázdná nebo neplatná, což způsobovalo chyby při pokusu zobrazit obrázek. Tady je, jak jsem to vyřešil.

Problém

Když data obsahují prázdný nebo neplatný blob obrázku, PHP funkce getimagesizefromstring vyhodí chybu. Potřeboval jsem robustní způsob, jak zjistit, zda data skutečně obsahují platný obrázek, a pokud ne, zobrazit zástupný obrázek.

Řešení

Přidal jsem několik kontrolních podmínek, které zajistí, že data obrázku nejsou prázdná nebo null, než je budu zpracovávat. Také jsem použil @ před getimagesizefromstring, abych potlačil případné chyby, které tato funkce může vyhodit, když data nejsou platným obrázkem.

Zde je upravený kód:

error suppression operator @

protected function assocFormImage(array $data, string $id): string
    {
        if (!empty($data['value']) && $data['value'] !== null && @getimagesizefromstring($data['value'])) {
            $base64 = base64_encode($data['value']);
            return "<td><a href='data:image/jpeg;base64,$base64' data-lightbox='image-$id'><img src='data:image/jpeg;base64,$base64' alt='Image' style='height: 50px'></a></td>";
        } else {
            return "<td><img src='" . (new Server_path())->server_url()['public'] . "assets/img/image_placeholder.jpg' alt='Image' style='height: 60px'></td>";
        }
    }

exception handling construct try-catch

protected function assocFormImage(array $data, string $id): string
    {
        try {
            if (!empty($data['value']) && getimagesizefromstring($data['value'])) {
                $base64 = base64_encode($data['value']);
                return "<td><a href='data:image/jpeg;base64,$base64' data-lightbox='image-$id'><img src='data:image/jpeg;base64,$base64' alt='Image' style='height: 50px'></a></td>";
            } else {
                return "<td><img src='" . (new Server_path())->server_url()['public'] . "assets/img/image_placeholder.jpg' alt='Image' style='height: 60px'></td>";
            }
        } catch (Exception $e) {
            if (DEBUGGER) {
                error_log("Exception caught while processing image: " . $e->getMessage());
            }
            return "<td><img src='" . (new Server_path())->server_url()['public'] . "assets/img/image_placeholder.jpg' alt='Image' style='height: 60px'></td>";
        }
    }

Vysvětlení

  1. Kontrola prázdných a null hodnot: Použil jsem podmínku !empty($data[‚value‘]) && getimagesizefromstring($data[‚value‘]), abych se ujistil, že hodnota není prázdná nebo null. Tím zabráním zpracování neplatných dat.
  2. Potlačení chyb pomocí @: Funkce getimagesizefromstring může vyhodit chybu, pokud data nejsou platný obrázek. Použití @ před funkcí potlačí tyto chyby. Tímto způsobem se vyhneme nežádoucím chybovým hlášením v produkčním prostředí.
  3. Návrat hodnoty: Pokud jsou data obrázku platná, převedu je na base64 zakódovaný řetězec a zobrazím je jako obrázek v tabulce. Pokud nejsou platná, zobrazím místo nich zástupný obrázek.

Výsledek

Tento přístup zajistí, že se vždy zobrazí buď platný obrázek, nebo zástupný symbol, pokud jsou data neplatná nebo prázdná. Tento způsob také zabraňuje chybám při zpracování neplatných dat.

Tímto způsobem jsem vyřešil problém s prázdnými nebo neplatnými blob daty obrázků a zajistil, že můj kód je robustnější a odolnější proti chybám.

Použití try-catch

Blok try-catch je struktura pro správu výjimek v PHP. Umožňuje zachytit specifické chyby a reagovat na ně odpovídajícím způsobem.

Výhody:

  • Přesná kontrola: Umožňuje přesně definovat, které chyby chcete zachytit a jak na ně reagovat.
  • Lepší správa chyb: Poskytuje lepší možnosti pro logování chyb a jejich následnou analýzu.
  • Specifické zpracování: Můžete definovat konkrétní akce pro různé typy výjimek.

Nevýhody:

  • Složitost: Je složitější a vyžaduje více kódu než použití @.
  • Výkon: Může být náročnější na výkon v porovnání s @.

Kdy použít @ vs try-catch

  • Použití @: Je vhodné pro jednoduché potlačení chyb, které nepovažujete za kritické, a kde víte, že potlačení chyby nezpůsobí větší problémy.
  • Použití try-catch: Je lepší pro robustní aplikace, kde je důležité mít přesnou kontrolu nad chybami a jejich zpracováním. Doporučuje se použít try-catch, pokud chcete zachytit specifické výjimky a reagovat na ně.

To je všechno k dnešnímu záznamu. Tento přístup mi pomohl zlepšit spolehlivost mého kódu a snížit množství chyb při zpracování obrázků. Pokud máte podobný problém, doufám, že vám tento příspěvek pomůže.


Comments

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *