nefunguje upload obrázků (přetečení povolené paměti)

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

Chtěl bych uploadovat obrázky k nějakému produktu do adresáře na servru.

Takhle vypadá část toho formuláře, respektive pak tam jsou už jen další textové pole a selecty atp.

function createComponentProduktyForm() {
$bytes = $this->return_bytes(ini_get('upload_max_filesize'));
  $form = new MyForm();
  $form->addFile('fotopath_produkty')
         ->addCondition(NForm::FILLED)
         ->addRule(NForm::MIME_TYPE, 'soubor musí být obrázek', 'image/*')
         ->addRule(NForm::MAX_FILE_SIZE, 'Soubor musí mít velikost max %i kB', $bytes);
  ...
  $form->addSubmit('save', 'Save')->getControlPrototype()->class('default');
  $form->onSubmit[] = callback($this, 'ProduktyFormSubmitted');
  ...
  return $form;
}
function produktyFormSubmitted(MyForm $form) {
  if ($form['save']->isSubmittedBy()) {
        $id = (int) $this->getParam('id');
        $values = $form->getValues();
        $produkty_model = new produkty();
        $file = $values['fotopath_produkty'];
        $image = NImage::fromFile($file);
        if ($file->isOk()) {
            $name = $file->getName();

            $path = "upload/produkty/full/" . $values['nazev_produkty'] . '-' . $name;
	    $path120 = "upload/produkty/120/" . $values['nazev_produkty'] . '-' . $name;
            $path240 = "upload/produkty/240/" . $values['nazev_produkty'] . '-' . $name;

	    $image120 = clone $image;
            $image120->resize(120, 90);
            $image240 = clone $image;
            $image240->resize(240, 180);

	    $image->save($path, 80, NImage::JPEG);
            $image120->save($path120, 80, NImage::JPEG);
            $image240->save($path240, 80, NImage::JPEG);
        }
	...
	// zápis do databáze atd.
  }
  $this->redirect('show');
}

Teď k jádru pudla.
zkoušel jsem uploadovat soubory které mají 100 a 500kB ve formátu JPEG a vše proběhlo OK.
Pak jsem vyzkoušel soubor který má 1MB ve formátu PNG a vyhodilo to laděnku (v tom lepším případě, jinak pouze php Fatal Error:)
Allowed memory size of 15728640 bytes exhausted (tried to allocate 5242880 bytes)
Zkoušel jsem i 1,17MB jpeg a ten mi to také neschroupalo a vyhodilo to již zmíněný php error
Fatal error: Allowed memory size of 15728640 bytes exhausted (tried to allocate 2300 bytes) in C:\Program Files (x86)\VertrigoServ\www\eshop\libs\Nette\Utils\Image.php on line 100

Hodnoty v php.ini mám:
upload_max_filesize = 3M
memory_limit = 15M
post_max_size = 8M

zkoušel jsem i zakomentovat řádky kde se vytváří ty náhlady $image120, $image240 a také nic.
Díky za jakékoliv nápady

Aurielle
Člen | 1281
+
0
-

memory_limit 15M je hodně málo. Zvyš aspoň na 32, nejlépe pak na 64 či 128M.

koprkuba
Člen | 24
+
0
-

Díky moc, mám to pouze na virtuálním localhostu pro vývoj, pak se budu muset podívat kolik je na ostrém servru. Dá se to nějak spočítat, ta maximální velikost souboru pokud budu vědět kolik je hodnoty na servru, které se dají vytáhnout přes ini_get()?
Třeba, když budu věděť, že memory_limit = 64MB tak jak spočítám jak velký soubor můžu poslat? A zanést do výpočtu ty hodnoty upload_max_filesize, post_max_size?

bojovyletoun
Člen | 667
+
0
-
450k JPG 1600x1200
before U: 3.93216 ,peak:3.93216
after open U: 13.631488 ,peak:13.631488
after cloning U: 13.631488 ,peak:13.631488
after resize 1 U: 14.155776 ,peak:14.155776
after resize cloned U: 14.680064 ,peak:14.680064

2MB, 7MP
before U: 3.93216 ,peak:3.93216
after open U: 39.583744 ,peak:39.583744
after cloning U: 39.583744 ,peak:39.583744
after resize 1 U: 39.845888 ,peak:39.845888
after resize cloned U: 40.63232 ,peak:40.63232
koprkuba
Člen | 24
+
0
-

Super díky moc, ale moc jsi mi neobjasnil jak se dá přijít na tyhle hodnoty?

bojovyletoun
Člen | 667
+
0
-
{
		    function dm($t){
			echo $t . " U: " . memory_get_usage(1) / 1e6 . " ,peak:" . memory_get_peak_usage(1) / 1e6 . "<br>";
		    }

		    $image = ImageMagick::fromFile("i/" . $This->im->name); // odněkud získáme obrážek

		    dm("after open");
		    $i2 = clone $image;
		    dm("after cloning");
		    $image->resize(300, NULL)->save('300', null, image::JPEG);
		    dm("after resize 1");
		    $i2->resize(400, null)->save('400', null, image::JPEG);
		    dm("after resize cloned");
		}
koprkuba
Člen | 24
+
0
-

Děkuju mnohokrát.