Diskuze: nette MultiUpload obrázků

PHP Nette Framework Nette framework nette MultiUpload obrázků

Avatar
danhosek
Člen
Avatar
danhosek:

Ahoj lidi, mám asi dost hloupou otázku. Nahrávám obrázky přez formulá. A mám problém se samotným uploadem obrázků. Do formuláře mám dán multiUpload pro výběr obrázků k uploadu:

$form->addMultiUpload('images', 'Obrázky')->setAttribute('accept', 'image/*');

Dále odesílám z prezenteru do modelu pole s obrázky $images.
ve funkci pro ukládání obrázků projíždím pole pomocí:

foreach ($images as $image) {

Kde dále mám vyřešené přejmenování obrázku, změnu velikosti a pod.
Ale mám problém se samotným uploadem obrázku na server.
Nevím, jak funkce v třídě Nette\Http\Fi­leUpload slouží u přenosu obrázku/souboru na server.
našel jsem funkce save a move, ale podle některých diskuzí save je jen pro uložení změn v souboru a move je pro přesun již nahraného souboru. A z dokumentace jsem něak nic nevyčet, co by mi to objasnilo.
Vytvoření miniatury z kopie mám také již vyřešené.
Mohl by mi někdo objasnit, jak je funkce pro upload? a ukázat jen podobný řádek na tomto přídladu?

>

// Konstanty pro manipulaci s obrázky.
    /** Cesta k obrázkům produktů. */
    const IMAGES_PATH = 'images/reference/';

    /** Velikost obrázku. */
    const IMAGE_SIZE = 400;


  /**
     * Nahraje a přiřadí obrázky k dané referenci.
     * @param string $url URL reference, ke které obrázky patří
     * @param int $i pořadové číslo obrázku
     * @param Image[] $images        obrázky z formuláře
     */
    public function saveReferenceImages($url, $images)
    {

        $i=0;
        foreach ($images as $image) {

            $image->resize(null, self::IMAGE_SIZE);
            $image->save(self::IMAGES_PATH . $url . '_' . $i . '_7.jpg', null, Image::JPEG);
            $i++;
        }
    }

!! Funkce je ohlodaná.
Obrázek se mi na server neuploadule a myslím, že je to tou funkcí save, která na upload není určená.
Děkuji mockrát za pomoc.

 
Odpovědět 19. listopadu 1:46
Avatar
Jan Bezdíček
Redaktor
Avatar
Jan Bezdíček:

Zkusil bych jit poporade

  1. ujistil bych se, ze form ma atribut enctype
enctype="multipart/form-data"
  1. ujistil bych se, ze opravdu probehlo nahrani souboru (vydumpovat promennou v akci presenteru, na ktery nahravas NEBO se podivat do tmp slozky Apache)
  2. pokud opravdu neco z formulare "prislo" a je to ve slozce tmp, ujistil bych se, ze to opravdu ulozi ten soubor kam ma (nekdy chybi lomitko na zacatku apod.)
 
Nahoru Odpovědět 19. listopadu 5:43
Avatar
danhosek
Člen
Avatar
Odpovídá na Jan Bezdíček
danhosek:

ahoj, hrál jsem si stím a zkoušel jsem možnosti a zjistil jsem že obrázky k uploadu neprojdou formulářem.
Formulář má

enctype="multipart/form-data"

a v presenteru mám use:

namespace App\CoreModule\Presenters;

use App\CoreModule\Model\ReferenceManager;
use Nette\Application\BadRequestException;
use Nette\Application\UI\Form;
use Nette\Database\UniqueConstraintViolationException;
use Nette\Utils\ArrayHash;
use Nette\Http\FileUpload;
use Nette\Utils\Image;

a zpracování formuláře:

public function editorFormSucceeded($form, $values)
        {
        // Převede pole obecných souborů na pole obrázků.
        $images = array_map(function (FileUpload $image) {
            return $image->toImage();
        }, $values->images);
        $values->offsetUnset('images');

        $url = $values->url;
        $images_count = $values->images_count;
                try {
            $this->referenceManager->saveReference($values);
            $this->referenceManager->saveReferenceImages($values->url, $images, $values->images_count);
            $this->flashMessage('Reference byla úspěšně uložena.');
            if ($values->images){
                $this->redirect('this');
            }else{
                $this->redirect(':Core:Reference:', $values->url);
            }

                } catch (UniqueConstraintViolationException $ex) {
                        $this->flashMessage('Reference s touto URL adresou již existuje.');
                }
        }

podmínkou if na redirect jsem testoval, zda prošli obrázky ke zpracování.
Já nevidím, proč by to nemělo fungovat.
Ještě multiupload do formuláře je přidán takto:

$form->addMultiUpload('images', 'Obrázky')->setAttribute('accept', 'image/*');
 
Nahoru Odpovědět 19. listopadu 21:08
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na danhosek
Jan Bezdíček:

Nejsem si jisty, jestli bys mel mit Model pro kazdy Presenter (soudim dle toho, ze mas Model pro Reference) ... Zkus sem hodit cely kod, kterym tvoris formular a rovnou i metodu SaveReferenceImages z referenceManageru

 
Nahoru Odpovědět 20. listopadu 0:37
Avatar
danhosek
Člen
Avatar
danhosek:

vytvoření formuláře:

protected function createComponentEditorForm()
{

        $form = new Form;
$form->addHidden('reference_id');
$form->addHidden('images_count');
        $form->addText('title', 'Titulek')->setRequired();
$form->addText('url', 'URL')->setRequired();
$form->addMultiUpload('images', 'Obrázky')->setAttribute('accept', 'image/*');
        $form->addText('description', 'Popisek')->setRequired();
        $form->addTextArea('content', 'Obsah');
        $form->addSubmit('submit', 'Uložit referenci');
        $form->onSuccess[] = [$this, 'editorFormSucceeded'];
        return $form;
}

SaveReference­Images:

    const IMAGES_PATH = 'images/reference/';
...

public function saveReferenceImages($url, $images, $images_count)
    {
        $i=0;
        foreach ($images as $image) {

            $image->resize(null, self::IMAGE_SIZE);
            $image->save(self::IMAGES_PATH . $url . '_' . $i . '_' . $images_count  . '.jpg', null, Image::JPEG);
            $images_count++;
        }

    }

tato funkce je zjednodušená, abych lépe hledal chybu při nahrávání.
Ale jak jsem psal v minulém příspěvku, tak už ani do presenteru do zpracování formuláře FormSucceeded nejpřijdou ty vybrané obrázky.
Alespoň myslím, že podmínka if ($values->images) by měla fungovat a jelikož vyjde negativně, tím images nic neobsahují.

 
Nahoru Odpovědět 20. listopadu 0:49
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na danhosek
Jan Bezdíček:

Achich ouvej :D kdyz si das dump() nebo var_dump() HNED na $values po odeslani formulare, tak tam ty obrazky jsou nebo ne ?

 
Nahoru Odpovědět 20. listopadu 1:08
Avatar
danhosek
Člen
Avatar
Odpovídá na Jan Bezdíček
danhosek:

neumím používat dump()... :( udělám dump($values); ? a nic víc? a kam se mi to vypíše?

 
Nahoru Odpovědět 20. listopadu 1:17
Avatar
danhosek
Člen
Avatar
Odpovídá na Jan Bezdíček
danhosek:

omlouvám se, nemám moc skušeností s nette začínám sním :)
udělal jsem tedy do zpravování formuláře dump()

public function editorFormSucceeded($form, $values)
        {
        dump($values);

ale vůbec nic to neudělá.
Pole values by se mělo vypsat na stránku že?

 
Nahoru Odpovědět 20. listopadu 15:56
Avatar
Filip Šedivý:

Problém je v tom že ve formuláři máš:

$form->onSuccess[] = [$this, 'editorFormSucceeded'];

Ale metoda pro zpracování je

public function saveReferenceImages($url, $images, $images_count)

A prostě editorFormSuc­ceeded !== saveReference­Images

Nahoru Odpovědět 1. prosince 0:00
Láska je, když si zapamatujete její IP, abyste obešli zpoždění DNS.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.