Poškozený JPEG a Nette\Image – kde řešit?
- jtousek
- Člen | 951
Ahoj,
dnes jsem poprvé v životě narazil na tuto chybu:
imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Premature end of JPEG file
Tato chyba se zobrazí, když se funkce imagecreatefromjpeg()
,
potažmo Nette\Image::fromFile()
, pokusí otevřít poškozený
obrázek. Samozřejmě existuje direktiva gd.jpeg_ignore_warning
,
která ale udělá pouze to, že se místo E_WARNING
vygeneruje
E_NOTICE
.
Přemýšlím o různých způsobech jak to řešit. Jedna z možností je,
zabudovat přímo do Nette\Image
volitelné potlačení těchto
chyb (pomocí Nette\Debug::tryError()
a
Nette\Debug::catchError()
), ale nejsem si moc jistý, zda je to tak
optimální – spíše chci radu, kde to řešíte nebo kde by se to
podle vás mělo řešit?
(Pokud si bude většina myslet, že přímo v Nette\Image, berte to jako request.)
- Mikulas Dite
- Člen | 756
Nejlepší by to podle mě bylo hned při uploadu. User většinou špatný obrázek nenahraje, to je větší šance, že se upload nějak pokazil. Informace ať to zkusí znovu/uloží image jinak je v pohodě.
Nette Image s tím nic nenadělá, ten zbytek nevygeneruje.
- jtousek
- Člen | 951
To mě napadlo, jenže kam to dát při tom uploadu?
Mám třídu, která se stará o upload souborů. Volitelně může kontrolovat jejich koncovky jestli jsou správné, ale umisťovat do ní nějakou pokročilou logiku kontroly, zda je obrázek validní mi připadá špatně. Tzn. měl by nějakou výjimku vyhodit až model když něco podobného dostane k uložení?
Navíc jak to efektivně zkontrolovat? Jiný způsob než pokusit se vytvořit resource pomocí Nette\Image asi není, že? (nevalidní nejspíš mohou být i PNG a GIFy, proto nechci volat přímo imagecreatefromjpeg)