Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Wysyłanie pliku
Forum PHP.pl > Forum > PHP > Frameworki
gazelek
Witam!
Na wstepie kawalki kodu:
Tworzenie formularza
Kod
'img' => array(
                        'file',
                        array(
                            'label' => 'Obrazek',
                            'Destination' => 'obrazki/'
                        )
                    ),
                    'plik' => array(
                        'file',
                        array(
                            'label' => 'Gra',
                            'Destination' => 'gry/'
                        )
                    ),
                    'sciezka' => array(
                        'text',
                        array(
                            'label' => 'lub podaj lokalizacje',
                            'required' => 'false'
                        )
                    ),

Dla objasnienia - kazdy rekord ma plik obrazka (img) oraz dodatkowy plik(dodawany z dysku, wtedy wykorzystane jest pole 'plik', lub z lokalizacji sieciowej - wtedy 'sciezka')

Dodawanie:
Kod
        $adapter=$form->img->getTransferAdapter();
        $file = substr($adapter->getFileName('img'),strlen('obrazki/'));
        if($adapter->receive()){
            $dane['img']=$file;
        }

            $adapter1=$form->plik->getTransferAdapter();
            $file=substr($adapter1->getFileName('plik'),strlen('gry/'));
        if($adapter1->receive()){
            $this->view->chu="niechu";
            $sciezka=$file;
        }
        else { //jesli nie udalo sie przeslac
            $sciezka=$this->_request->getPost('sciezka');
            $this->view->chu="chu";
        }
        $dane['path']=$sciezka;

Zmienna 'chu' - tylko do testow, dzieki niej wyswietlam sobie na stronie, ktora czesc zostala wykonana. Jaki jest problem? Po uzupelnieniu formularza i zatwierdzeniu otrzymuje:

Cytat
The file 'img' was illegal uploaded, possible attack


Atak sam na siebie?smile.gif Czy czasem nie jest tak, ze wymagana jest zmiana pliku po wyslaniu (tak, juz wiem, ze robi sie to za pomoca klasy Zend_Filter_File_Rename)? Chyba, ze powod jest inny - a mi nic do glowy nie przyszlo...

Dodam, ze na stronie wyswietla sie po wykonaniu, procz powyzszego ostrzezenia rowniez 'niechu' - co oznacza, ze $adapter1->receive() zwrocilo 0.
EarthCitizen
Cytat
$adapter1->receive() zwrocilo 0


Jak dla mnie to po prostu pole img jest puste i nic się nie przesyła. A wygenerowany kod formularza jest prawidłowy?
gazelek
Tak, formularz jest ok. Popatrzylem po folderach - img sie przesyla, jest kopiowane do folderu obrazki, ale to drugie kopiowanie sie juz nie wykonuje....

Dokladnie: img sie przesyla ($adapter->receive() zwraca 1, do tablicy wpisywana jest nazwa pliku), wypluwane jest ostrzezenie i 'plik' juz nie jest przesylany ($adapter1->receive() zwraca 0, a sciezka wogole jest pusta)
qba_rox
Pobierajac adapter:

  1. <?php
  2. $adapter=$form->img->getTransferAdapter();
  3. ?>


pobierasz ustawienia dla jednego inputa ('img' w tym wypadku).
Wywolujac metode

  1. <?php
  2. $adapter->receive()
  3. ?>

probojesz walidowac, filtrowac i przeniesc wszystkie pliki, ktore zostaly przeslane, twoj pierwszy plik zostanie prawidlowo obsluzony, bo dostarczyles jego ustawienia, natomiast, drugi bedzie obsluzony z ustawieniami domyslnymi, wiec np nie zostanie przeniesiony tam gdzie chcesz, tylko zostanie w folderze tymczasowym. I co najwazniejsze, po obsludze kazdego z tych plikow zostaje ustawiona flaga, ze zostal obsluzony.
Dalej, probojesz powtorzyc to samo wraz z ustawieniami dla drugiego pliku, z tym ze problem jest taki, ze probojesz to zrobic dla oflagowanych juz plikow. dlatego jest wyrzucany wyjatek. Rozwiazanie jest bardzo proste:

  1. <?php
  2. $adapter=$form->img->getTransferAdapter();        
  3. $adapter->receive('img');
  4. $adapter1=$form->plik->getTransferAdapter();
  5. $adapter1->receive('plik');
  6. ?>
gazelek
... i na koniec dopiero sprawdzenie metoda receive(), czy transfer zostal wykonany. Piekne dzieki winksmiley.jpg

Jeszcze pytanie (z racji, ze nie mam czasu teraz tego sprawdzic) - czy to jest rozwiazanie problemu dla wyrzucanego ostrzezenia? Tresc jak w pierwszym poscie, possible attack.
qba_rox
raczej metoda isRecived(); i tak, nie bedziesz mial juz tego wyjatku, wszystkoa ladnie pojdzie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.