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)