Omezení uploadu při použití kontejneru
- Rellik
- Člen | 104
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
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
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
- 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
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é :-/