Nette 2.3: Nette\Image: problém s uploadem poškozeného obrázku

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

Ahoj.

  1. Nainstaluju sandbox (Nette 2.3).
  2. Do přihlašovacího formuláře přidám fileUpload.
  3. Do zpracování tohle:
	public function signInFormSucceeded($form, $values)
	{
		$upload = $values->upload->getTemporaryFile();

		$image = Nette\Utils\Image::fromFile($upload);
	}
  1. Uploadnu tam tento (poškozený) soubor: http://evidencia-dopravcov-git.bmhd.cz/…/92/9199.jpg
  2. Dostanu PHP chybu:

Parse Error: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: 4r

Když koukám na implementaci třídy Image, byl tam nedávno přidán error handling:
https://github.com/…ls/Image.php#L174

Pokud to správně chápu, podobné chyby by to mělo odchytávat a přebalovat na ImageException.

To by bylo skvělé, protože ImageException můžu jednoduše ve své aplikaci odchytit, u chyby je to problematičtější.

Jsou všechny mé úvahy správné a je to opravdu bug, nebo jsem někde udělal chybu?

Díky.

Používám PHP 5.5.9, obdobné chování má i stabilní verze Nette 2.2.

David Grudl
Nette Core | 8228
+
0
-

Na 2.2 to vyhodí warning, na 2.3 ImageException. Proč tam máš parse error netuším.

enumag
Člen | 2118
+
0
-

Co to udělá s touhle PHP direktivou?

ini_set('gd.jpeg_ignore_warning', 1);
Eda
Backer | 220
+
0
-

Zkoušel jsem dát dump do error handleru v nettím Callback.php:

	public static function invokeSafe($function, array $args, $onError)
	{
		$prev = set_error_handler(function($severity, $message, $file) use ($onError, & $prev) {
			dump(func_get_args());die;
			if ($file === __FILE__ && $onError($message, $severity) !== FALSE) {
				return;
			} elseif ($prev) {
				return call_user_func_array($prev, func_get_args());
			}
			return FALSE;
		});

		try {
			$res = call_user_func_array($function, $args);
			restore_error_handler();
			return $res;

		} catch (\Exception $e) {
			restore_error_handler();
			throw $e;
		}
	}

A ten handler se vůbec nezavolá. Proto není ani vyhozena exceptiona.

@enumag S touto direktivou to projde bez chyb. Já bych se ale spíše chtěl o té chybě nějak dovědět, než ji ignorovat. Ale díky za námět :-)

Editoval Eda (8. 2. 2015 22:56)

enumag
Člen | 2118
+
0
-

@Eda Jsem si to ze zvědavosti zkusil pustit u sebe (jen z cmdline, žádný upload) a hodilo mi to zcela správě tuto výjimku:

Nette\Utils\ImageException: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Premature end of JPEG file

PHP 5.5.18, Nette 2.3-dev

Eda
Backer | 220
+
0
-

Laděnka, co mi to háže:
http://leteckaposta.cz/563473357

(Nette 2.3dev, PHP 5.5.9)

Přehlížím něco zásadního?

Edit: fix odkazu na laděnku.

Editoval Eda (9. 2. 2015 1:14)

enumag
Člen | 2118
+
+1
-

V té laděnce je nějak rozbitý callstack, nikde tam třeba není to volání invokeSafe. Každopádně tvoje chyba to asi nebude, v prvé řadě bych zkusil upgrade PHP.