Upload obrázku na server – nefunkční Form::MIME_TYPE a Form::MAX_FILE_SIZE
- RDPanek
- Člen | 189
Ahoj, mám menší problém:
<?php
public function createComponentPhotoForm()
{
$form = new AppForm();
$form->addTextArea('description_photo', 'Popis fotografie*:', 30, 2)
->addRule(Form::FILLED, 'Popis fotografie musí být vyplněn.');
$form->addFile('file', 'Fotogalerie*:')
->addCondition(Form::FILLED)
->addRule(Form::MIME_TYPE, 'Povolené formáty fotografií jsou pouze JPEG nebo JPG', 'image/jpeg')
->addRule(Form::MAX_FILE_SIZE, 'Fotografie nesmí být větší než 1MB', '1000');
$form->addHidden('id_photogallery', $this->getRequest['id_photogallery']);
$form->addSubmit('cancel', 'Ukončit editor')
->setValidationScope(FALSE);
$form->addSubmit('ok', 'Uložit novou fotografii');
$form->onSubmit[] = callback($this, 'processSavePhoto');
return $form;
}
?>
a prozatimní zpracování:
<?php
public function processSavePhoto(AppForm $form)
{
if ($form->isSubmitted()) {
if ($form['cancel']->isSubmittedBy()) {
// process cancelled
$this->flashMessage('Vytváření fotogalerie bylo ukončeno.', 'notice');
$this->redirect('this#tabs-1');
}
if ($form['ok']->isSubmittedBy() && $form->isValid()) {
// submitted and valid
$values = $form->getValues();
/*
* Kontrola, zda-li byl obrazek skutecne nahran
*/
if($values['file']->isOk()){
} else {
$this->flashMessage('Obrázek se nezdařilo nahrát na server.', 'warning');
}
dump($values['file']->isOk()); exit();
}
}
dump(Environment::getHttpRequest()); exit();
}
?>
pokud zadám fotografii JPG vše proběhne dobře a zpracování se zastaví
o dump.
Pokud zadám třeba něco s jiným formátem a velikostí 2MB – zpracování
jako kdyby bylo přeskočeno a vrátím se zpět, jako kdybych ve zpracování
měl pouze něco ve smyslu:
$this->redirect(‚this‘);
proč mi to nebere ty kontroly?
Při té příležitosti bych se zeptal, jak zmenšit obrázek, jest-li to nette umí, díky :-)
- despiq
- Člen | 320
to jestli je to jpg nebo cokoliv jinyho tak na tom nemuze zalezet, co je to
2MB ? neskoci tam error o limitu nastavenem v ini?
zkousel si nahravat napr 200KB soubory ?
kazdopadne si znovu precti dokumentaci formularu pri pouzivani vice tlacitek
<?php
$form->addSubmit('ok', 'Send')
->onClick[] = 'OkClicked'; // nebo 'OkClickHandler'
$form->addSubmit('cancel', 'Cancel')
->setValidationScope(FALSE)
->onClick[] = 'CancelClicked'; // nebo 'CancelClickHandler'
?>
tak proc
<?php
$form->onSubmit[] = callback($this, 'processSavePhoto')
?>
obrazky sou taky v dokumentaci
https://doc.nette.org/cs/utils/images
a pryc s tim exitem
$this->terminate(); i kdyz to tam vlastne stejne nema co delat
- RDPanek
- Člen | 189
despiq napsal(a):
to jestli je to jpg nebo cokoliv jinyho tak na tom nemuze zalezet, co je to 2MB ? neskoci tam error o limitu nastavenem v ini?
zkousel si nahravat napr 200KB soubory ?kazdopadne si znovu precti dokumentaci formularu pri pouzivani vice tlacitek
<?php $form->addSubmit('ok', 'Send') ->onClick[] = 'OkClicked'; // nebo 'OkClickHandler' $form->addSubmit('cancel', 'Cancel') ->setValidationScope(FALSE) ->onClick[] = 'CancelClicked'; // nebo 'CancelClickHandler' ?>
tak proc
<?php $form->onSubmit[] = callback($this, 'processSavePhoto') ?>
obrazky sou taky v dokumentaci
https://doc.nette.org/cs/utils/imagesa pryc s tim exitem
$this->terminate(); i kdyz to tam vlastne stejne nema co delat
jj zkoušel – oprava – skript mám nastavený na 1M limit
- RDPanek
- Člen | 189
Pokud zakomentuji:
<?php
$form['file']
->addCondition('FormTools::uploadTest', $maxFileSize)
->addRule(Form::MIME_TYPE, 'Přílohou musí být obrázek formátu .jpg .', 'image/jpeg')
->addRule(Form::MAX_FILE_SIZE, 'Velikost přílohy může být nanejvýš ' . TemplateHelpers::bytes($maxFileSize) . '.', $maxFileSize);
?>
tak skript pokračuje správně dál, pokud to zakomentované není,
formulář, jako by se ani neodeslal…
V čem by mohla být chyba?
- RDPanek
- Člen | 189
Ola napsal(a):
Ty handlery se volají jen pokud byl formulář validní. Pokud chceš dělat něco při nevalidním vstupu, použij pole
$form->onInvalidSubmit[]
namísto$form->onSubmit[]
To funguje, ale jde mi o to, ošetřit formulář ještě před odesláním, dyť k tomu addCondition… jsou
$form->addFile('image_file', 'Fotogalerie*:');
$form['image_file']
->addCondition('FormTools::uploadTest', $maxFileSize)
->addRule(Form::MIME_TYPE, 'Přílohou musí být obrázek formátu .jpg .', 'image/jpeg')
->addRule(Form::MAX_FILE_SIZE, 'Velikost přílohy může být nanejvýš ' . TemplateHelpers::bytes($maxFileSize) . '.', $maxFileSize);
- Ola
- Člen | 385
Aha, sorry.
Když už tam ten FormTools máš, tak ho použij úplně, tedy doplň si tam
něco jako:
<?php
$maxFileSize = 1572864; // 1,5MB
$phpUploadMaxFileSize = FormTools::bytes(ini_get('upload_max_filesize'));
if ($phpUploadMaxFileSize < $maxFileSize) {
$maxFileSize = $phpUploadMaxFileSize;
}
?>
Nemůže to taky být toto? https://forum.nette.org/…iewtopic.php?…
Editoval Ola (6. 6. 2010 19:13)
- RDPanek
- Člen | 189
použiji -li toto:
if ($_SERVER['CONTENT_LENGTH'] > FormTools::bytes(ini_get('post_max_size'))) {
dump("OK"); exit();
}
není zachyceno.
zpracování vypadá takto:
public function processSavePhoto(AppForm $form)
{
if ($form->isSubmitted()) {
if ($form['cancel']->isSubmittedBy()) {
// process cancelled
$this->flashMessage('Vytváření fotogalerie bylo ukončeno.', 'notice');
$this->redirect('this#tabs-1');
}
if ($form['ok']->isSubmittedBy() && $form->isValid()) {
// submitted and valid
$values = $form->getValues();
/*
* Kontrola, zda-li byl obrazek skutecne nahran a zda se jedna o obrazek
*/
if($values['image_file']->isOk() AND $values['image_file']->isImage()){
/*
* Vytvoreni nazvu
*/
$fileName = $values['id_photogallery']."_".String::webalize($values['image_file']->getName(), '.');
/*
* Definovani cesty
*/
$fileTarget = WWW_DIR . "/photogallery/" . $fileName;
/*
* velikost fotografie
*/
$size_photo = $values['image_file']->getImageSize();
/*
* Priprava hodnot pro zapis do DB
*/
$arr = array(
'id_photogallery' => $values['id_photogallery'],
'id_admin' => $this->myInfo['id_admin'],
'status' => '0',
'date_create' => Date("Y-m-d", Time()),
'name_photo' => $values['description_photo'],
'size_disk_photo' => $values['image_file']->getSize(),
'size_photo_width' => $size_photo['0'],
'size_photo_height' => $size_photo['1'],
'name_photo_disk' => $fileName
);
/*
* Ulozeni obrazku do adresare
*/
if($this->multimediaModel->SaveNewPhoto($arr)){
/*
* Ulozeni souboru
*/
$values['image_file']->move($fileTarget);
$this->flashMessage('Fotografie byla úspěšně uložena.', 'notice');
} else {
$this->flashMessage('Fotografii se nezdařilo uložit.', 'warning');
}
} else {
$this->flashMessage('Fotografii se nezdařilo nahrát na server.', 'warning');
}
}
}
$this->redirect('Multimedia:detailPhoto', array ('id_photogallery' => $values['id_photogallery']));
}
a továrnička:
public function createComponentPhotoForm()
{
$maxFileSize = 1572864; // 1,5MB
$phpUploadMaxFileSize = FormTools::bytes(ini_get('upload_max_filesize'));
if ($phpUploadMaxFileSize < $maxFileSize) {
$maxFileSize = $phpUploadMaxFileSize;
}
$form = new AppForm();
$form->addTextArea('description_photo', 'Popis fotografie*:', 30, 2)
->addRule(Form::FILLED, 'Popis fotografie musí být vyplněn.');
$form->addFile('image_file', 'Fotogalerie*:');
// soubor je povinný
// @todo Vytvořit ochranu nahrávaných souborů
$form['image_file']
->addCondition('FormTools::uploadTest', $maxFileSize)
->addRule(Form::MIME_TYPE, 'Přílohou musí být obrázek formátu .jpg .', 'image/jpeg')
->addRule(Form::MAX_FILE_SIZE, 'Velikost přílohy může být nanejvýš ' . TemplateHelpers::bytes($maxFileSize) . '.', $maxFileSize);
$form->addHidden('id_photogallery', $this->getRequest['id_photogallery']);
$form->addSubmit('cancel', 'Ukončit editor')
->setValidationScope(FALSE);
$form->addSubmit('ok', 'Uložit novou fotografii');
$form->onSubmit[] = callback($this, 'processSavePhoto');
return $form;
}
Editoval Gaudentius (6. 6. 2010 19:36)
- RDPanek
- Člen | 189
newPOPE napsal(a):
Gaudentius napsal(a):
To funguje, ale jde mi o to, ošetřit formulář ještě před odesláním
Predpokladam, ze na check suboru resp. koncovky budes musiet napisat kus JS. Generovany NETTE JS asi nevie validovat typ suboru len ci je vyplneny alebo nie
aha – já myslel, že pokud uvedu MIME_TYPE a MAX_FILE_SIZE, že nette vygeneruje potřebný javascript – jinak by to bylo k ničemu zadávat při definici formuláře, nehledě na to, že pokud uvedu nevyhovující soubor – úplně se přeskočí zpracování.