Kontrola validity uploadovaného obrázku

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

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

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)

David Grudl
Nette Core | 8228
+
0
-

Pokusím se dát Debugger::tryError už do fromFile()