Diskuse k MultiFileUpload

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

Diskuse ke komponentě MultiFileUpload.

Editoval echo (13. 7. 2011 18:56)

pidiclovek
Člen | 91
+
0
-

Ahoj, už se asi dvě hodiny trápím s tímto addonem a jeho použitím v modulech. Nedaří se mi vůbec nahodit uploader, ikdyž všechny cesty jsou správné ve finálním zdrojáku – např k flashi či skriptům, uploader se nenačte a jen vyhodí hlášku There is no support for any of these: html5,flash,silverlight.

Nasimulovat lze lehce, stačí vytvořit např AdminModule, do kterého přesunout HomepagePresenter s šablonou, upravit extends na \BasePresenter a do bootstrapu přidat routu

$router[] = $adminRouter = new RouteList('Admin');
	$adminRouter[] = new Route('admin/<presenter>/<action>', 'Homepage:default');

už jsem vyzkoušel snad vše, zdrojáky prošel od shora dolů… prosím o radu

natrim
Člen | 73
+
0
-

podle toho co píšeš máš v runtimech jen html5,flash a silverlight
a tvůj prohlížeč nepodporuje ani jedno

<?php
// Runtimes - possible ('gears', 'flash', 'silverlight', 'browserplus', 'html5')
    $uploader->runtimes = array('flash');
?>
pidiclovek
Člen | 91
+
0
-

Díky za odpověď, ale tím to určitě není, můj prohlížeč podporuje všechny tři uvedené, jinak by ani nemohlo fungovat demo , kdy není presenter v žádném modulu. Stačí jej přesunout i s templatou do nějakého modulu a přidat routu viz výše a jste tam, kte jsem já. Kde je jen zakopanej ten pes :)

Zkoušel jsem si i hrát s konstantou BASE_PATH tak, aby všechny cesty ve spouštěcím scriptu plupload seděli, nicméně neuspěl jsem.

echo
Člen | 134
+
0
-

Ukázka ti funguje? Pokud ano, hoď sem skeleton, mrknu se.

echo
Člen | 134
+
0
-

Tak mě napadá, zalinkoval jsi i scripty. Myslím tím componentu head.

pidiclovek
Člen | 91
+
0
-

@echo Ahoj, díky za reakci, už si nevím rady, připadám si jako trouba, bude to nějaká pitomost… Ukázka mi funguje bez problémů, tady je link na skeleton s použitím modulu, je to jen upravená původní ukázka. Head componenta se normálně načítá, kontroloval jsem i cesty k těm skriptům a jsou vpořádku.

Mockrát díky za pomoc! :)

echo
Člen | 134
+
0
-

Nakonec jsou problémem přece jen cesty. Viz. /mfu/www/admin/temp/jsloader-148eb4fdd989.js?1313699074". /admin/ je tam evidentně navíc. Tady bude asi nějaký problémek u cssLoaderu, neboť cesta jemu předaná je správná, nebo jsem tu chybu způsobil já, když jsem jej upravoval. Každopádně navrhuji vytvořit Head mimo modul a upravit BASE_PATH, pak by to mělo šlapat.

echo
Člen | 134
+
0
-

Tak heureka.
Problém nebyly cesty k pluploadu, ale cesty k jquery :-). Má metoda BASE_PATH co je v ukázce není zrovna nejšťastnější a tím pádem všude, kde byla použita, se BASE_PATH vypisovala špatně (viz. předchozí post). Stačí to nějak kulantně ošetřit v \BasePresenteru a je to.

PS: Doporučuji FireBug, je to nástroj k nezaplacení.

pidiclovek
Člen | 91
+
0
-

Díky za pomoc! Firebug používám, ale ne uplně na všechno, což asi změním :) Teď už to podle výše uvedeného snad dokopu do zdárného konce, díky :)

pidiclovek
Člen | 91
+
0
-

Tak jsem tu opět :(… Mým problémem je callbacková fce, ve které chci ukládat soubory, respektive jejich názvy do db. V tom by neměl být problém, ale!

Funkce callbacku, a tedy i upload souboru jsou úspěšné jen tehdy, pokud se o zápis nepokusím, což je opravdu divné, jedinné co mě napadá je nějaký timeout uploaderu pro callbackovou fci…
Protože s tímto kódem:

<?php
        $fileName = $class->getSanitizedName();
        $pi = pathinfo($fileName);
        $file = $pi['filename'];
        $ext = $pi['extension'];

        $path = UPLOAD_DIR . '/' . $this->lang . "_" . $this->uploadFolder . '/'
                . Strings::webalize($this->uploadObject->title) . "/";

        $additionalToken = 0;

        if (file_exists($path . $class->getSanitizedName()))
             do{
                $additionalToken++;
            }while (file_exists($path . $file.$additionalToken. ".".$ext));


        if ($additionalToken == 0)
            $finalFileName = $class->getSanitizedName();
        else
            $finalFileName = $file . $additionalToken . "." . $ext;


        $class->move($path . $finalFileName);


        //$this->models->links->savePicture($this->uploadObject->id, $finalFileName, $this->lang);
        //$this->models->links->hasPictures($this->uploadObject->id, $this->lang);


?>

proběhne upload úspěšně, zatímco když odkomentuji poslední dva řádky, což je přes model loader uložení do db, upload spadne s hláškou IO error.Error #2032. Obě dvě metody pro uložení do db jsou vpořádku, při zavolání odjinud fungují tak jak mají. V čem může být problém?

Kód továrničky na mfu je stejný jako v demu. Mohl bych si ce přidat pod uploader tlačítko pro uložení do db, ale to mi přijde uživatelsky opravdu nevhodné, mohlo by se na to zapomínat…

V kódu až do metody move také problém není, bez něj se to chová stejně :(

pidiclovek
Člen | 91
+
0
-

Tak je na místě omluva, příspěvek výše můžete klidně smazat, ať to nikoho nemate a případně neodradí od této skvělé komponenty, za kterou tímto děkuji :)

chyba byla v špatně zapsaném mkdir, zapomněl jsem na parametr rekurze. Možný poznatek pro ostatní:

Pokud uděláte v callbacku chybu, neozve se laděnka, ale projeví se to právě errorem IO error.Error #2032 , snad to alespoň někomu pomůže :)

echo
Člen | 134
+
0
-

Pro ověřování funkčnosti callbacků je dobré nastavit runtime na html5 a ověřovat si průběh v konzoli firebugu. Až je vše odladěné stačí přehodit runtimes apod. Tady doporučuji flash, neboť jak se zdá html5 má problém s většími soubory (50MB+) neprošlo, resp. nezačalo se ani uploadovat. Flash touto vadou netrpí, testoval jsem na 350MB souborech.

Honza Kuchař
Člen | 1662
+
0
-

Žádám autora tohoto doplňku o přesunutí komponenty do sekce formulářů na stránce doplňků a nějakém jednoznačném oddělení od původní komponenty tedy MultipleFileUploaderu. (i mě samotného to zmátlo a divil jsem se, kdo že mi to přepsal doplněk) Nebo je to parazitování, na již zaběhnutém produktu? Pánové vzpamatujte se, když někdo krade kód, chápu to, ale jména snad krást nebudeme, ne?

Jack06
Člen | 168
+
0
-

Nu nevím, zda to připadá divné jenom mě, ale trochu nechápu konstrukce. složka mfu je v:
app/mfu - ok to bych si upravil jako app/components/mfu

Nicméně v inicializaci komponent odkazuješ na:
BASE_PATH . '/mfu' - tedy do složky root/mfu, jenomže ve složce rootu bývá: app, libs, www, temp, uploads

Tak jsem jen slepej, nebo mi to nesedí. Není náhodou z venku zákaz vstupu do app?? Čiže pak je blbost ta inicializace složek.

Poprosil bych tedy o objasnění a popřípadě uvedení proč to má fungovat a kde se správně zadefinuje složka uploads

22
Člen | 1478
+
0
-

asi bych napřed prošel http://cs.metrostate.edu/…h01Notes.htm

Jack06
Člen | 168
+
0
-

22 napsal(a):

asi bych napřed prošel http://cs.metrostate.edu/…h01Notes.htm

Nu to číst nepotřebuju. Prošel jsem si už ty dvě třídy takže už v pohodě.

zopper
Člen | 20
+
0
-

Jack06 napsal(a):

Nicméně v inicializaci komponent odkazuješ na:
BASE_PATH . '/mfu' - tedy do složky root/mfu, jenomže ve složce rootu bývá: app, libs, www, temp, uploads

BASE_PATH v tomto případě má obsahovat cestu ke stejnému adresáři, jako WWW_DIR, akorát z pohledu serveru a nikoliv klienta. Tak to aspoň mě funguje.

Zato řeším, jak navázat invalidaci snippetů, nebo aspoň jakýkoliv js callback po dokončení nahrávání (úspěšném, ale i neúspěšném).

EDIT: koukám, že reaguju pozdě, nevadí :D

EDIT2: callback aktuálně řeším úpravou jquery.ui.plupload.js, ale nevím, jestli to je čisté řešení… (co potřebuju – na stránce s uploadem je i seznam souborů, který se musí aktualizovat – invaliduju snippety)

Editoval zopper (7. 9. 2011 12:43)

Jack06
Člen | 168
+
0
-

Taky to momentálně chci řešit, tak pokud někdo dosáhnete úspěšného výsledku nebylo by od věci to sem hodi.
Krom tohoto mám ještě jeden problém – při uploadu jsem na určité adrese:
http://www.expample.com/<presenter>/<action>/<id> při zobrazení upload formuláře id mám a dokonce se mi i hlásí v konzoli a správně. Nicméně pokud odešlu upload, tak v parametru id mám prázdno a nedaří se mi to záplatovat.

Po postu vypadá $this->presenter->getParam() takto:

array(3) {
  ["action"]=>
  string(7) "content"
  ["id"]=>
  NULL
  ["do"]=>
  string(15) "photoAdd-Upload"
}

Díky

EDIT: Nu tak id parametr asi vyřeším přes multipart_params.

EDIT2: jen ještě taková technická, to k tomu budu muset přistupovat přes hnusný $_REQUEST?

Editoval Jack06 (8. 9. 2011 15:58)

echo
Člen | 134
+
0
-

@Honza Kuchař
Omlouvám se za pozdní odpověď.

Přesouvat pod formuláře je značně nelogické, neboť komponenta nemá s Nette\Forms nic společného.

Přejmenovat by se to mohlo, ovšem osobně mě nic výstižnějšího nenapadá, navíc je komponenta popsána a je jasně uvedeno, že se jedná o plupload.

O parazitování se nejedná, komponentu jsem napsal s ohledem na nefunkčnost tvého pluginu pro aktuální verzi Nette. Kvůli časové tísni pro mě bylo výhodnější napsat si komponentu vlastní – a tu pak sdílet, než-li studovat a upravovat tvou.

Každopádně jsem zvědav na pokračování vývoje MultipleFileUploaderu. Hodně zdaru.

saimons
Člen | 293
+
0
-

Jakym zpusobem lze po dokonceni nahravani invalidovat snippet pod uploadovacim oknem?
Pokud jsem na tuto stranku nahral doplnek nette jquery ajax tak mi nefunguje mfu.

echo
Člen | 134
+
0
-

saimons napsal(a):

Jakym zpusobem lze po dokonceni nahravani invalidovat snippet pod uploadovacim oknem?
Pokud jsem na tuto stranku nahral doplnek nette jquery ajax tak mi nefunguje mfu.

Nette jquery ajax by měl fungovat, zkus přehodit pořadí načítání scriptů na: jquery, jquery_ui, jquery_nette, plupload

  1. Upravit nastavení plupload, aby posílal „ajaxový“ header a volal funkci pro invalidaci snippetu $.nette.success
// Setup gears version
$("#uploader{!$token}").plupload({
    // General settings
    runtimes : {$runtimes},
    url : {link Upload!},
    max_file_size : {$maxFileSize},
    chunk_size : {$maxChunkSize},
    flash_swf_url : {$flashUrl},
    silverlight_xap_url : {$silverlightUrl},
    headers: {'X-Requested-With': 'XMLHttpRequest'},
    init : {
        // Called when a file has finished uploading
        FileUploaded: function(up, file, info) {
            var json = jQuery.parseJSON(info.response);
            $.nette.success(json);
        }
    }
});
  1. Zakomentovat řádek 269 v souboru Uploader.php
//die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');
Droid
Člen | 92
+
0
-

Ahoj, nějaké řešení problému s cestami? Pořád ne a ne to rozběhat.

olkins
Člen | 30
+
0
-

Ahoj, nevite nekdo, jestli by uploader slo nejak spustit i v IE?

Leinad
Člen | 23
+
0
-

Hodil by se update tohoto doplňku. Nefungovala mi HTML5 verze, dost možná kvůli http://www.plupload.com/…iewtopic.php?… a povedlo se mi to vyřešit updatem na novější plupload.

echo
Člen | 134
+
0
-

Proveden refactoring, přidán Git. Zdá se mi to přehlednější.

mykky
Člen | 1
+
0
-

vyřešil někdo, jak řesně vložit jQuery a jaké? Píše mi to nepodporu html5, ale demo mi jde.
Díky

platinix
Člen | 1
+
0
-

Použil jsem poslední verzi komponenty (Plupload 2.0), podařilo se mi ji rozchodit, ale nefunguje mi tlačítko „Start upload“. Po jeho stisknutí se nic nestane, zároveň se nevypíše chyba do konzole. Nemá s tím někdo zkušenost?

Start nahrávání jsem vynutil vlastním click handlerem:

$("#uploader-test_start").live("click", function (event) {
    var uploader = $(".plupload").plupload("getUploader");
    uploader.start();
});
motorcb
Člen | 552
+
0
-

Mne to konci hlaskou pri uploadu:

Upload URL might be wrong or doesn't exist

slozky www/upload511/test a www/upload511/temDir jsem zalozil.
V kodu jsem nic nemenil…

motorcb
Člen | 552
+
0
-

motorcb:

Problém opraven.
Chyběla mi tam metoda volaná po odeslání formuláře:

public function tests(\Nette\Http\FileUpload $class)
{
      $class->move(UPLOAD_DIR . '/' . $class->getSanitizedName());
}
Ascaria
Člen | 187
+
0
-

Komponenta je to parádní, ale jako sůl jí chybí možnost navěsit funkci na event onQueueComplete, který je tam asi 3×, pokaždé se jinak jmenuje a nejde se k němu vůbec dostat.

Editoval Ascaria (19. 11. 2012 14:11)

Hafran
Člen | 121
+
0
-

Mohl bych požádat o nějaké funkční online demo, nebo alespoň vysvětlení v čem se komponenta liší od MFU ? Nechce se mi ji rozchodit, abych pak zjistil, že to nedělá to co chci, díky. :)

michal.lohnisky
Člen | 64
+
0
-

platinix napsal(a):

Použil jsem poslední verzi komponenty (Plupload 2.0), podařilo se mi ji rozchodit, ale nefunguje mi tlačítko „Start upload“. Po jeho stisknutí se nic nestane, zároveň se nevypíše chyba do konzole. Nemá s tím někdo zkušenost?

Start nahrávání jsem vynutil vlastním click handlerem:

$("#uploader-test_start").live("click", function (event) {
    var uploader = $(".plupload").plupload("getUploader");
    uploader.start();
});

Díky za fix, stalo se mi to stejné.

Také bych se přimluvil za to, co napsal Hafran

echo
Člen | 134
+
0
-

Hafran napsal(a):

Mohl bych požádat o nějaké funkční online demo, nebo alespoň vysvětlení v čem se komponenta liší od MFU ? Nechce se mi ji rozchodit, abych pak zjistil, že to nedělá to co chci, díky. :)

Zdravím,
komponenta vznikla proto, že MFU nebylo funkční na Nette 2.0 a ani dnes není oficiálně podporováno. Jednoduše se mi nechtělo čekat nebo zkoumat zdrojové kódy. Komponentu jsem dokončil a zveřejnil.

MFU má z konceptu větší potenciál, protože není vázáno na konkrétní JS.

Rozchodit by to neměl být problém, alespoň na čistém sandboxu ne. Stačí okopírovat z GitHubu, JS se načte černou magií, pokud nechcete jinak.

Co se účelu týče. Po úspěšném nahrání souboru se zavolá callback, kterému se předá Nette\Http\FileUpload. Callback se volá po nahrátí každého souboru, ne najednou.

To je celé. :)

Hafran
Člen | 121
+
0
-

Ok díky, určitě by ale neškodilo dát na stránku addonů příklad zpracování obrázků (zdůraznit to Nette/Http/FileUpload). :)

Máš v plánu nějak spravit to tlačítko „start upload“ a zavést ten handler na onQueueComplete? Dost by to pomohlo. Navíc mi konzole hází nějakou JS chybu, ale vypadá to že to bude něco v JQuery a na funkčnosti to nevadí.

echo
Člen | 134
+
0
-

Upload tlačítko nespravím, protože je to chyba Pluploadu ⇒ stáhnout novou verzi a nahradit soubory na příslušných místech.

Eventy přidávat nebudu, nepotřebuju je. Pokud ty ano, vyrob si novou komponentu. Inspiruj se tímto: https://github.com/…UIWidget.php a eventy nastav v šabloně podle http://www.plupload.com/…e_events.php.

Řekl bych, že je to dost flexibilní, ale nesnaží se být univerzální.

michal.lohnisky
Člen | 64
+
0
-

Neměly by se ve třídě JQueryUIWidget ve funkcích __construct a attached volat rodičovské metody?

Editoval michal.lohnisky (21. 1. 2013 17:24)

echo
Člen | 134
+
0
-

michal.lohnisky napsal(a):

Neměly by se ve třídě JQueryUIWidget ve funkcích __construct a attached volat rodičovské metody?

Jaké metody máš na mysli? Konstruktor je v rodičovských třídách přítomen pouze v Nette\ComponentModel\Component a je de facto nepovinný.
Attached se volá, když se komponenta připojí do stromu komponent v presenteru. Zde je pouze kvůli magickému načítání js a css pro lenivce, jiný účel nemá.

michal.lohnisky
Člen | 64
+
0
-

Já jsem si tento plugin upravoval a chtěl jsem si předat do handleUpload nějaké parametry, ale dokud jsem nepřidal volání rodičovských metod, tak se mi žádné parametry nepředaly.

petak23
Člen | 16
+
0
-

Chcem sa opýtať, akým spôsobom sa dá urobiť presmerovanie po úspešnom ukončení uploadu všetkých súborov?

echo
Člen | 134
+
0
-

Droid napsal(a):

„There is no support for any of these: html5,flash,gears“.
Řešil to někdo? Dřív komponenta fungovala bez uploadu, teď nenaběhne vůbec.

Špatně načtený javascript.

Droid
Člen | 92
+
0
-

Tak koukám, že příspěvek se pošle 2× a smazání jednoho vede ke smazání i toho druhého.
Díky za tip, kouknu na javascript.

rohlizde
Člen | 4
+
0
-

Ahoj, mam takový problém. Úspěšně se mi podařila implementace plupload pluginu, ale nefunguje mi callback funkce na upload souboru. Soubor se nahraje do TEMP složky v pořádku. Ale když volám

public function uploadImage(\Nette\Http\FileUpload $plupload){
        $plupload->move('/uploads');
    }

Tak to vzhodí v opeře dragonfly. záložka network->preview:

There is no support for any of these: html5,flash

a obrázek se nenahraje. To samé se stane při pokusu ručně přes move_uploaded_file. Zkoušel jsem i absolutní cestu…

echo
Člen | 134
+
0
-

rohlizde napsal(a):

Ahoj, mam takový problém. Úspěšně se mi podařila implementace plupload pluginu, ale nefunguje mi callback funkce na upload souboru. Soubor se nahraje do TEMP složky v pořádku. Ale když volám

public function uploadImage(\Nette\Http\FileUpload $plupload){
        $plupload->move('/uploads');
    }

Tak to vzhodí v opeře dragonfly. záložka network->preview:

There is no support for any of these: html5,flash

a obrázek se nenahraje. To samé se stane při pokusu ručně přes move_uploaded_file. Zkoušel jsem i absolutní cestu…

Zdravím, dle api https://api.nette.org/…oad.php.html#149 máte špatně nastaven přesun – je nutné uvést celou cestu k souboru, nikoliv pouze adresář.

Zaměňte za:

public function uploadImage(\Nette\Http\FileUpload $plupload){
        $plupload->move('/uploads/'.$plupload->getName());
    }

Kdyby to nepomohlo, uveďte prosím celou implementaci.

rohlizde
Člen | 4
+
0
-

echo napsal(a):

rohlizde napsal(a):

Ahoj, mam takový problém. Úspěšně se mi podařila implementace plupload pluginu, ale nefunguje mi callback funkce na upload souboru. Soubor se nahraje do TEMP složky v pořádku. Ale když volám

public function uploadImage(\Nette\Http\FileUpload $plupload){
        $plupload->move('/uploads');
    }

Tak to vzhodí v opeře dragonfly. záložka network->preview:

There is no support for any of these: html5,flash

a obrázek se nenahraje. To samé se stane při pokusu ručně přes move_uploaded_file. Zkoušel jsem i absolutní cestu…

Zdravím, dle api https://api.nette.org/…oad.php.html#149 máte špatně nastaven přesun – je nutné uvést celou cestu k souboru, nikoliv pouze adresář.

Zaměňte za:

public function uploadImage(\Nette\Http\FileUpload $plupload){
        $plupload->move('/uploads/'.$plupload->getName());
    }

Kdyby to nepomohlo, uveďte prosím celou implementaci.

Nakonec se mi to povedlo rozchodit na linuxovém serveru. Předtím to bylo pouštěné na lokálu. Takže funguje. :-)

Edit: Už to funguje i na widlích. Nevim kde byl přesně problém.

Editoval rohlizde (15. 8. 2013 10:34)

rohlizde
Člen | 4
+
0
-

Mám dotaz. Jde někde nastavit při validaci formuláře na straně klienta, že soubor musí být pouze obrázek? Jako je v nette pravidlo FORM:image. A ještě kde se dá změnit vzhled toho formuláře obecně. Díky.

Editoval rohlizde (15. 8. 2013 16:37)

MW
Člen | 626
+
0
-

Chápu prosím správně, že callback v metodě setOnSuccess() je volán po každém jednotlivém nahrání souboru?
Tedy vždy pracuji jen s jedním souborem?

Díky !

echo
Člen | 134
+
0
-

Vydal jsem novou verzi pro Nette 2.1, php 5.4 a Plupload 2.1. Více na githubu: https://github.com/…511/Plupload

rumcais1
Člen | 80
+
0
-

Zkouším rozchodit na 2.1. V readme je Register compiler extension Můžete mi někdo poradit jak to zaregitrovat. Díky

jiri.pudil
Nette Blogger | 1029
+
0
-

V configu v sekci extensions:

extensions:
	plupload: Echo511\Plupload\DI\PluploadExtension