Nette upload upload/post limit

redbulliik
Člen | 3
+
0
-

Ahoj, používám multiupload pro upload obrázků, které se dále zpracují(resize, miniatura 1.fotky).
Když vyberu více obrázků, nebo příliš velké obrázky, applikace zkolabuje.(dříve se na stránce vypsalo mnoho znaků)nyní app zkolabuje(error 500) a vytvoří se exception, která je prázdná ale myslím, že jde o překročení upload/post limitu.
Je možné někde nastavit limit uploadovaných souborů? Nebo to něak chytře obejít?
Děkuji.

Editoval redbulliik (15. 12. 2016 22:19)

chemix
Nette Core | 1294
+
+1
-

@redbulliik ahoj, kde hostujes? nejake veci jdou nastavit pomoci set_ini, ale obecne je spise snadnejsi zvolit si hosting takovy, ktery ti nehazi klacky pod nohy, ale spise ti jde na ruku. Jestli si provozujes vlastni VPS tak mrkni na direktivy max_post_size, max_file_uploads, max_file_size pripadne set_time_limit

Danny19
Člen | 5
+
0
-

Ahoj, mám podobný problém, ale všechny direktivy mám nastavené na dost vysokou hodnotou. Ale stále mi to při multiuploadu někdy vyhodí error500.
Zvláštní je to, že například pokud mám obrázek 300kb. ale má rozlišení 5000×3000, tak to hodí error, pokud mám ale obrázek který má 3MB ale rozlišení třeba 2000×1600, tak to proběhne v pohodě. A když si to dumpnu, tak mi to zdá se hází ten error až u clone $img Nevíte někdo, čím by to mohlo být? Díky moc
Tady je kod:

private function saveImages(Product $product, $images)
{

    foreach ($images as $image) {

        $imgName = $image->getName();

        $hashImgName = sha1($imgName . new DateTime());

        $img = $image->toImage();

        $thumb = clone $img;

        $thumb->crop('50%', '50%', ProductImage::THUMB_SIZE, ProductImage::THUMB_SIZE);
        $thumb->resize(null, ProductImage::THUMB_SIZE);
        $thumb->save(ProductImage::IMG_PATH . $hashImgName . "_thumb.jpg", null, Image::JPEG);

        $img->resize(ProductImage::IMG_SIZE_WIDTH, NULL);
        $img->crop('50%', '50%', ProductImage::IMG_SIZE_WIDTH, ProductImage::IMG_SIZE_HEIGHT);
        $img->save(ProductImage::IMG_PATH . $hashImgName . ".jpg", null, Image::JPEG);

        $newImg= new ProductImage();
        $newImg->name = $imgName;
        $newImg->hash = $hashImgName;
        $newImg->date = new DateTime();
        $product->addImage($newImg);
    }

}
janpecha
Backer | 75
+
+1
-

@Danny19 nejspíš málo dostupné paměti RAM na serveru. Třída Image používá na pozadí knihovnu GD, která není zrovna z nejúspornějších. Zjednodušeně – když otevře obrázek, rozloží si ho v paměti na jednotlivé pixely – takže když má obrázek velké rozlišení, může v paměti zabírat i několik desítek/stovek MB.

Ty těch obrázků navíc asi otevíráš několik a už je neuvolňuješ z paměti (k tomu by měla sloužit funkce imagedestroy).

Danny19
Člen | 5
+
0
-

Díky moc za reakci…No já nakonec clone nahradil klasicky vytvořením nového objektu…od té doby to funguje dobře, kromě třeba těch 3 velkých fotografií, to mi spadne chybou "Allowed Memory Size of 134217728 Bytes Exhausted…, takže přesně jak píšeš :) když v php.ini nastavím ze 128M na 256M, tak to proběhne v pořádku…Jinak takhle to ukládání a práci s obrázkama mám správně? nebo mi tam ještě něco chybí ??? Nebo třeba nedoporučilbys mi nějaký dobrý doplněk, který by třeba zpracoval obrázky u klienta a pak teprve upload na server? Pár jsem jich viděl, ale asi to není úplně to co chci. Rád bych zachoval tu metodu, kterou teď ten obrázek zpracovávám a ukládám, akorát třeba bez metody resize. Neporadil bys mi prosim? :)

JZechy
Člen | 161
+
+2
-

@Danny19 U klienta asi nic skvělého nebude, ale jedna možnost je nainstalovat na server image magick.

Nicméně, asi před měsícem jsem řešil podobný problém, kdy jsem potřeboval obrázky ze Samsungu otáčet do správné orientace, jenže telefon obrázek rovnou z fotáku odesílal standardně v rozlišení okolo 4000 – 5000 pixelů. Takže jsem nastavil, že pokud dojde obrázek větší jak 2000 pixelů, tak ho nejdřív zmenším pod limit. Zatím k přetečení paměti znova nedošlo.

Danny19
Člen | 5
+
0
-

@JZechy díky, vyzkouším… mě by se líbilo něco takového jQuery File Upload, ale nevím jestli to není zbytečné a jestli by se to dalo nastavit tak jako mám tu metodu saveImage() a zdali by to bylo k dobru :)
Já na souboru zavolal metodu toImage() a pro thumb znova, úplně zbytečně.
Mám to teď takto a zdá se že je to zatím ok:

private function saveImages(Product $product, $images)
{
    set_time_limit(10 * 60);

    foreach ($images as $image) {

        $imgName = $image->getName();

        $hashImgName = sha1($imgName . new DateTime());

        $img = $image->toImage();

        $thumb = new ProductImage();
        $thumb = $img;

        $thumb->resize(null, ProductImage::THUMB_SIZE);
        $thumb->save(ProductImage::IMG_PATH . $hashImgName . "_thumb.jpg", null, Image::JPEG);

        $img->resize(ProductImage::IMG_SIZE_WIDTH, NULL);
        $img->save(ProductImage::IMG_PATH . $hashImgName . ".jpg", null, Image::JPEG);


        $newImg= new ProductImage();
        $newImg->name = $imgName;
        $newImg->hash = $hashImgName;
        $newImg->date = new DateTime();
        $product->addImage($newImg);


    }

}
JZechy
Člen | 161
+
+1
-

@Danny19 Tak pokud chceš hezký upload, tak to není špatná věc, a má to i implementaci do Nette :)

Danny19
Člen | 5
+
0
-

@JZechy … jéé, teď jsem si teprve všiml, že ten doplněk je tvůj :)

Editoval Danny19 (16. 4. 2017 13:45)