Omezení uploadu při použití kontejneru

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

Zdravím, po delší době hlásím, že jsem opět zde. :)
Mám problémek, který je nejpravděpodobněji mezi klávesnicí a židlí, ale už fakt nevím. Snažím se vytvořit takový jednoduchý multiupload pomocí formulářového kontejneru. Není to sice určitě optimální, nicméně v rámci možností to funguje. Jen nemůžu docílit omezení oploadu na určitou velikost souboru. Pokud nastavím, třeba 3Mb a dám nahrát větší soubor, který ovšem není větší než 8Mb, tak omezení funguje. Pokud, ale dám uploadnout soubor větší než zmíněných 8Mb, vyskočí laděnka s chybou:

Notice

Undefined index:
$pole = $_FILES['foto']['name'];

Bude to nejspíš nastavením serveru, což je v podstatě nepodstatné. Chtěl sem aby to zvládl ošetřit samotný script, a ne aby to vyhodilo eror, za který může server.

Form:

$container = $form->addContainer('foto');
        for ($i = 1; $i <= 5; $i++) {
            $container->addUpload('file' . $i, 'Soubor:')
             ->addRule(Form::MAX_FILE_SIZE, 'Maximální velikost souboru je 7,5 Mb.', 7500 * 1024 /* v bytech */);
        }

Dá se to ještě nějak ošetřit? Taky to nebere podmínku
->addRule(Form::IMAGE, ‚Avatar musí být JPEG, PNG nebo GIF.‘)
Pokud je nějaký input prázdný, tak vyskočí, že soubor musí být v uvedeném rozsahu… To sem nicméně ošetřil později. Takže tohle ani tak moc neřeším…
Pokud by někdo měl nějaký nápad co provést aspoň s tím omezením velikosti byl bych moc rád… :) A kdyby se vyřešilo obojí, bylo by to úplně supr… :)

David Matějka
Moderator | 6445
+
0
-

mne to funguje OK. vygeneruje se ti v poradku html? (v name indexy atd.)?
pokud to skonci bez chyb, tak jsou v poradku pristupne odeslane soubory (ve spravne stromove strukture)?

jakou mas verzi nette?

Rellik
Člen | 104
+
0
-

Verze nette poslední – stahnutá včera (Nette Framework 2.0.4 pro PHP 5.3 nebo 5.4) Pokud uploaduju soubor/y menší než 8Mb, všechno funguje jak má. Fotky su uploadnou, zmenší, vytvoří miniatury, zapíšou do DB, pokud už existují, tak se nepřepíší, jen oznámí že už existují… S menšími soubory není problém. Form se vykreslí správně, upload proběhne taky správně. Dělají to právě jen ty větší soubory… :( Už mě nenapadá co s tím… :(

Prado
Člen | 21
+
0
-
  • případ, kdy není soubor vůbec odeslán, řeší addCondition(Form::FILLED)
  • 7.5Mb (bity) != 7.5MB (bajty) = 7.5*1024*1024 != 7500*1024
  • omezení serveru lze vypsat pomocí:
echo ini_get("upload_max_filesize");
echo ini_get("post_max_size");

Pokud je soubor větší než limit pro upload, tak se nenahraje.
Podobně komplet POST se musí vejít do toho druhého.

  • tohle je asi tvůj kód:
$pole = $_FILES['foto']['name'];

Pokud ano, tak prostě otestuj přes empty(), jestli je to tam nebo ne, čímž chybu ošetříš. Nebo to přebírej přes Nette, tam je na to metoda isOK() ve FileUpload

Editoval Prado (10. 9. 2012 23:07)

Rellik
Člen | 104
+
0
-

Prado Díky za odpověď. Upravil sem to trochu jinak. Ono při poslání většího objemu dat než je post_max_size, se neodešle nic. Takže k tomu využívám jeden skrytý input, který musí být taky vyplněný hodnotou, kam se upload má provést. Takže když je ten limit překročen, neprojde script dál díky kontrole tohoto inputu. Takže je tak eliminovaná ta chyba s $pole = $_FILES[‚foto‘][‚name‘];.
Jinak ten přepočet (Mb, MB) vím, že je trochu jiný, ale to neřeš… :)

Nicméně pořád je tu chyba s omezením uploadu pouze na obrázky.
Když přidám kontrolu odesílaných souborů aby šlo pouze o obrázky, tak při odeslání pouze jednoho z 5, vyhodí chybovou hlášku (Obrázek musí být JPEG, PNG nebo GIF.) a neodešle se nic..

$container = $form->addContainer('foto');
        for ($i = 1; $i <= 5; $i++) {
            $container->addUpload('file' . $i, 'Soubor:')
                      ->addRule(Form::IMAGE, 'Obrázek musí být JPEG, PNG nebo GIF.');
        }

Tohle bych čekal spíš kdybych tam měl ještě podmínku Form::FILLED. Ale takhle je to celkem nepochopitelné :-/

Prado
Člen | 21
+
0
-

Relik: prostuduj si rozdíl mezi addCondition a addRule. Tvůj problém řeší to první.