nefunguje upload obrázků (přetečení povolené paměti)
- koprkuba
- Člen | 24
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
- koprkuba
- Člen | 24
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
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
- bojovyletoun
- Člen | 667
{
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");
}