Upload obrázku na server – nefunkční Form::MIME_TYPE a Form::MAX_FILE_SIZE

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

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
+
0
-

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
+
0
-

Zatím díky, pročtu a když to nepůjde, tak se ještě ozvu. Jinak jsem byl kojen na prvních verzích nette a ten exit, byl jen zkušebně – na ostro samozřejmě používám terminate :-) Díky

RDPanek
Člen | 189
+
0
-

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/images

a 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
+
0
-

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?

despiq
Člen | 320
+
0
-

zkusil bych to jen s
->addRule(Form::MIME_TYPE, ‚Přílohou musí být obrázek formátu .jpg .‘, ‚image/jpeg‘)

z errory po odeslani se ti zobrazujou?

RDPanek
Člen | 189
+
0
-

tak bohužel :-)
když nevložím obrázek, nebo když vložím .png tak se prostě zpracování přeskočí :-(

errory = nevím jak nasadit v presenteru a zobrazit v template

Ola
Člen | 385
+
0
-

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[]

RDPanek
Člen | 189
+
0
-

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);
newPOPE
Člen | 648
+
0
-

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

Ola
Člen | 385
+
0
-

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
+
0
-

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
+
0
-

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í.