Kontrola validity uploadovaného obrázku

- Rypi
 - Člen | 38
 
Ahoj, mám script který uploaduje soubor, zkontroluje, převede na obrázek,
zmenší a uloží. Při nahrání poškozeného souboru se ale vyskytne chyba a
uživateli se ukáže e500. Nyní řeším, jak problém ošetřit.
Script je přibližně takto:
$file = $data['photo'];
if($file->isOK()){
if($file->isImage()){
$nahled = $file->toImage(); // Zde se vyskytne chyba
$nahled->resize(parent::PHOTO_RES_PREVIEW_X, parent::PHOTO_RES_PREVIEW_Y);
Vyhodí chybu:
Warning: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Premature end of JPEG file
Pokud přidám před $file->toImage() zavináč, script už vyhodí
výjimku:
Nette\InvalidArgumentException IMAGE IS NOT VALID a to už mohu
ošetřit
try{
@$nahled = $file->toImage();
$nahled->resize(parent::PHOTO_RES_PREVIEW_X, parent::PHOTO_RES_PREVIEW_Y);
}catch(\Nette\InvalidArgumentException $e){
$this->flashMessage($e->getMessage(), 'ko');
$this->redirect("default");
}
Mne by zajímalo, proč díky zavináči získám vyjímku, jestli to takto ošetřeno může být, nebo bych to měl udělat jinak. Děkuji za rady a názory ;)
Editoval Rypi (21. 7. 2011 14:39)

- Filip Procházka
 - Moderator | 4668
 
Warning je potlačen zavináčem, metoda fromFile vytvoří
tudíž neplatný resource, který se kontroluje při vytváření objektu
Image. Takže jsi potlačením chyby posunul script až do bodu,
kde už to kontroluje Nette.
Lepší ale bude asi něco jako:
use Nette\Diagnostics\Debugger;
try {
	Debugger::tryError();
	$image = $file->toImage();
	if (Debugger::catchError($error)) { // příjmá referencí a doplňuje zprávu chyby
		throw new Nette\InvalidArgumentException($error);
	}
} catch (Nette\InvalidArgumentException $exception) {
	Debugger::catchError($error); // obnovit původní handler
	echo $exception->getMessage();
	return ;// chyba
}
$image->resize(parent::PHOTO_RES_PREVIEW_X, parent::PHOTO_RES_PREVIEW_Y);
// ...
Nebo tam prostě necháš zavináč…
Editoval HosipLan (21. 7. 2011 14:59)