Poškozený JPEG a Nette\Image – kde řešit?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jtousek
Člen | 951
+
0
-

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
+
0
-

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
+
0
-

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)