FileUpload a podivne chovani metody „move()“

riki123456
Člen | 3
+
0
-

Ahoj,

narazil jsem na zvlastni problem a nevim co s tim.
Jde mi o to, ze potrebuju z jednoho presenteru volat ve smycce nekolik dalsich requestu nad jinymi presentery.
Request mi z puvodniho podedi vetsinu parametru. Vse funguje jak ma az do doby, kdy mam v parametrech take uploadovany soubor.

Zjistil jsem, ze spravne soubor ulozi az posledni request.
Kdyz jsem hledal, kde je zakopan pes, vsiml jsem si zvlastniho radku ve FileUpload tride (https://api.nette.org/…oad.php.html#170).

Tento radek mi zpusobi to, ze pri prvnim requestu najde spravne soubor v tempu, nicmene po provedeni move() jiz tmpName odkazuje na cil a dalsi request tudiz vezme ten cil a s nim provede move().

Diky tomu mam na konci uploadnuty jen jeden soubor (misto tolik, kolik bylo requestu).
Pokud by se tmpName nemenilo (zkusil jsem na test napr. $fileUpload->toImage()->save(), ktery to nedela) tak vse probehne v poradku.

Nevite nekdo, jak nato?
Pripadne jaky je duvod, ze se tmpName prepisuje?

Diky.

Jinak, tady ukazka kodu, jak volam ty requesty ve smycce (na konci jsou ty uploadovane files).

<?php
$request = new Request($presenterName, $method, $params, $paramsPost, $this->getHttpRequest()->getFiles());
$presenter = $app->getPresenterFactory()->createPresenter($presenterName);
$presenter->run($request);
?>
Jan Endel
Člen | 1016
+
+1
-

Ahoj,

můžeš prosím popsat usecase, proč potřebuješ volat z jednoho presenteru jiný presenter?

riki123456
Člen | 3
+
0
-

No zkusim :)

Mam api, pres ktere se z web. aplikace ovlada nejake fyzicke koncove zarizeni.
Funguje to cca tak, ze frontend zavola ajaxem api, ja v presenteru spocitam co je potreba a pote (pres dalsi externi knihovny) poslu nejake konkretni prikazy do zarizeni (a to uz si provede co ma).

Takze, pro jednoduchost, mam napr. /$zarizeni1/on (pro zapnuti), ktere ve finale zpusobi, ze se zarizeni zapne.
Doted to bylo vzdy 1:1, takze vyse uvedeny priklad zapinal jen $zarizeni1.

Nicmene, ted je potreba (z ruznych duvodu, ktere neovlivnim) aby toto volani (a ruzna dalsi navazna) doputovalo do vice zarizeni (do kterych, to mam v databazi ve vazebni tabulce). Takze vlaste, aby se na zaklade volani /$zarizeni1/on provedlo postupne /$zarizeni1/on, /$zarizeni2/on, /$zarizeni3/on atd. Hloupe je, ze to prvni volani muze klidne „skupinove“ volat i dalsi api, napr. /$zarizeni1/state/get, /$zarizeni2/state/get, /$zarizeni3/state/get atd.

Zaroven je potreba, aby to zustalo co nejobecnejsi, protoze techto (skupinovych) volani bude vice a samotna metoda v presenteru by vubec nemela vedet, ze je volana „skupinove“.

Takze, abych nevrtal do vsech hotovych metod a jelikoz takhle „funkcionalita“ muze byt vyzadovana od ruznych metod ruznych presenteru, tak jsem si vytvoril extra presenter, ktery si ulozi vstupni parametry, pak si zjisti, zda nemusi obslouzit vice zarizeni a pokud ano, tak zavola smycku requestu (kde jen pozmeni nektere parametry, dle toho, do jakeho zarizeni se posila) a tim vlastne nasimuluju akci frontendu, kde by se jinak „klikalo“ tolikrat, kolik zarizeni musim obslouzit.

Nejdriv jsem to chtel udelat pres curl, ale pak jsem si rikal, ze by bylo vyhodnejsi to udelat pres nette, kdyz umi poslat request na jiny presenter a nemusim resit ruzne curl_set_opt kvuli session, opravnenim, vytahovat vyjimky apod.

Jak rikam, vse funguje krasne, akorat pokud je soucasti dat i upload, tak to zahapruje na tom move() …

Jan Endel
Člen | 1016
+
+2
-

Zrovna v tomhle případě mi curl přijde jako více než vhodné řešení, případně nadstavba nad ním Guzzle pro rychlejší práci. Volání tímhle způsobem jednoho presenteru z jiného bych víc než nedoporučoval. Nette je stavěno na php aplikace typu pusť request, zpracuj, vrať response. Ty ho používáš style pusť request, reuquest, request …, spoj odpovědi a vrať. Prosím, použij pro tohle curl.

riki123456
Člen | 3
+
+1
-

kouknu nato Guzzle. Na prvni pohled to vypada dobre.

Diky za odpoved a radu.