[addon multiplefileupload] MultipleFileUpload – form control

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

Ešte ma napadla jedna otázka. Dá sa nastaviť, aby sa povolil len výber jednoho súboru?
V JS by malo byť niečo ako multi_selection:false.

Edit: Nastaviť myslím, ako nastaviť pri vytváraní komponenty, nie priamo v JS – potrebujem to len pre jeden Presenter.

Editoval orech (23. 11. 2012 11:14)

Matúš Matula
Člen | 257
+
0
-

pri vytvarani komponenty vies nastavit max. pocet suborov, kt. mfu spracuje, ale mal by si rovnako obmedzit ich pocet aj v JS, inak to bude velke WTF :-)

<?php
$form->addMultipleFileUpload('file_upload', 'Testík', 1); // 1 subor
?>
orech
Člen | 40
+
0
-

Aha, som si myslel, že keď tam mám 20, tak to je 20 MB ako max_file_size parameter.
V tom JS (initJS.js) to neviem nájsť. Lebo nechcem mať napevno, že len jeden súbor.

EDIT2: initJS.js, pridal som:

{if ($maxFiles == 1)}
                multi_selection:false,
            {/if}

EDIT: Keď som skúšal demo uploadera, tak mi išlo pridávať súbory cez tlačítko. Teraz mi ide pridať len pomocou Drag 'n Drop. Keď kliknem na tlačítko Pridať súbory, tak sa mi otvorí okno, kde vyberiem súbory, dám OK a no žiaden sa neobjaví v uploaderi. Robí to pri HTML5, pri flashom to ide v poriadku.

EDIT 3: Chybu robil JS live-form-validation. Bolo treba vyhodiť upload form z validovania (riadok, cca 524):

Nette.addEvent(window, 'load', function () {
    for (var i = 0; i < document.forms.length; i++) {
            if (document.forms[i].getAttribute('id') != 'frm-uploadForm') {
                Nette.initForm(document.forms[i]);
            }
        }
});

Editoval orech (27. 11. 2012 10:10)

duskohu
Člen | 778
+
0
-

Caute, viete mi poradit aky mozem mat problem ked mi vracia komponenta:

Call to undefined method Nette\Application\UI\Form::addMultipleFileUpload().

proste mi ju nezaregistruje, uz fakt neviem preco, pritom mam v bootstrap:

MultipleFileUpload::register();

verzia addonu: Verze z 27. 8 2011 od Kashpi pro Nette 2.x pro PHP 5.3
nette: 2.1-dev

Editoval duskohu (18. 12. 2012 16:44)

Matúš Matula
Člen | 257
+
0
-

mozno chyba v NS, menil som tam viacero veci, kt. si uz nepamatam :) .. skus pouzit moju upravenu verziu, mala by fungovat

duskohu
Člen | 778
+
0
-

Tak som skusil tu upravenu verziu: https://github.com/Ciki/MFU ale stale nic, proste v bootstrap ked zaregistrujem pomocou:

MultipleFileUpload::register();

tak to urobi, lebo nevrati ziadnu chybu, ale ked to pouzijem uz na:

$form = new Form;
$form->addMultipleFileUpload("upload","Balíček souborů");

tak mi da:

Call to undefined method Nette\Application\UI\Form::addMultipleFileUpload()

proste sa to nezaregistruje. Nakopiroval som:

  1. z WWW_DIR/modules/multipleFileUpload >> do mojho WWW_DIR a dalsie potrebne js, css
  2. app/components/MultipleFileUpload >> do mojho components
  3. do head som dal : {!=MultipleFileUpload::getHead()}
  4. do bootstrap >> MultipleFileUpload::register();

Urobil som nieco zle?

jetpack
Člen | 71
+
0
-

No já poradím jak to mám já:
Máme normálně staženou celou knihovnu (MultiFileUpload, swfupload, uploadify)
V bootstrap.php:

<?php
$configurator->addConfig(__DIR__ . '/config/config.neon');
$container = $configurator->createContainer();
// Kde máš umístěný ten register ty?
MultipleFileUpload::register();
MultipleFileUpload::getUIRegistrator()
    ->clear()
    ->register("MFUUIHTML4SingleUpload")
    ->register("MFUUISWFUpload");
MultipleFileUpload::setQueuesModel(new MFUQueuesDibi()); // Spojeno s MySQL připojením na queue
?>

taktéž mám v head:
{!=MultipleFileUpload::getHead()}
na $formu mám:

<?php
$form = new Nette\Application\UI\Form;
$form->addMultipleFileUpload("files","Soubory",20);
?>

Máš tam nalinkované soubory? :
<script src=„{$basePath}/js/jquery.livequery.js“></script>
<script src=„{$basePath}/js/nette-ajax-driver.js“></script>
<script src=„{$basePath}/js/nette-ajax-form.js“></script>

duskohu
Člen | 778
+
0
-
MultipleFileUpload::getUIRegistrator();
Mam hned za $container->addService('router', $router);

ked som ho dal pred tak mi vratilo:
Service 'router' has already been registered.

nalinkovane subory mam tiez, aj keby nie tak je to jedno na tych teraz nezalezi, kedze mi vracia ze nevie najst metodu v Form, takze ju ani nezaregistruje, co je divne ze pri registracii mi neda ani error, takze ako by ju zaregistrovalo, ale nieje tam.

Call to undefined method Nette\Application\UI\Form::addMultipleFileUpload().
jetpack
Člen | 71
+
0
-

No já to mám stažené odsud:
https://componette.org/search/?…
to jsem přidal do Libs a

<?php
MultipleFileUpload::getUIRegistrator()
    ->clear()
    ->register("MFUUIHTML4SingleUpload")
    ->register("MFUUISWFUpload");
?>

mám za

<?php
$container = $configurator->createContainer();
?>
duskohu
Člen | 778
+
0
-

a ide ti to aj na nette nette: 2.1-dev?, pouzivam nove tovarnicky cez create a inject, a stable 2.0 to nepodporuje.

jetpack
Člen | 71
+
0
-

Aha já mám 2.0.7 a ozkoušeno na 2.0.6 .

Matúš Matula
Člen | 257
+
0
-

Tak som ti to rozbehal aj na 2.1dev .. staci tato mala uprava https://github.com/…d9e44be3964a

duskohu
Člen | 778
+
0
-

Super, dakujem, ze to bude v tomto ma ani nenapadlo :-)

duskohu
Člen | 778
+
0
-

caute viete mi poradit, ako nastavim validaciu na prvok? Lebo nastavenie mime type mi nefunguje.

$form->addMultipleFileUpload("upload2", "Druhý balíček souborů")
        ->addRule(MultipleFileUpload::validateMimeType, 'Povolene je len zip', '
            application/x-zip,
            application/zip,
            application/x-zip-compressed,
            application/octet-stream');

vrati mi to:

Undefined class constant 'validateMimeType'
enumag
Člen | 2118
+
0
-

Pač to neni jako konstanta, musel bys to tam dát jako callback… Ale nemá to smysl, ani tak by to nefungovalo. ;-)

duskohu
Člen | 778
+
0
-

Preco by to nefungovalo? Tak ako validovat tuto komponentu?

Editoval duskohu (29. 12. 2012 12:09)

enumag
Člen | 2118
+
0
-

Pardon, zkopíroval jsem omylem špatný link, pointa byla že ta metoda validateMimeType vyhazuje výjimku.

duskohu
Člen | 778
+
0
-

Vsimol som si ze ked chcem uploadnut zip subor tak mi vypise alert Invalid file type. a v html kode mam: accept=„image/jpeg,image/gif,image/png“, ako viem toto zmenit? lebo som hladal a nic som nenasiel, ziadnu konfiguraciu. Popripade aj velkost max file size pre 1 subor? Vie mi niekto poradit? pls.

<input
id="p17fu3q4vk1u05vi21jr1s478s30_html5"
style="font-size: 999px; position: absolute; width: 100%; height: 100%;"
type="file"
accept="image/jpeg,image/gif,image/png"
multiple="multiple">

Editoval duskohu (2. 1. 2013 18:49)

Matúš Matula
Člen | 257
+
0
-

skus pozriet js konfiguraciu pouzivaneho interface, napr. pre plupload tu https://github.com/…ad/initJS.js#L23

duskohu
Člen | 778
+
0
-

Pouzivate niekto https://componette.org/search/?… miesto netteForms.js?

dada-amater
Bronze Partner | 52
+
0
-

duskohu napsal(a):

Pouzivate niekto https://componette.org/search/?… miesto netteForms.js?

Používám to bez problému, nijak se to s MFU nemlátí.

dada-amater
Bronze Partner | 52
+
0
-

Strávil jsem pár dní s vrtáním se v MFU, konkrétně jeho verzí pro nette 2.0.x z GITu. Narazil jsem na pár bugů:

  1. SQLite3 není u mě funkční (PHP 5.3.21), při ukládání se Sqlite3::escapeString(serialize($file)) spolehlivě ořízne na znaku \x00, řešení je stejné jako u tohoto problému .
  2. Co mi dalo zabrat byl problém nefunkčnosti v Google Chrome (verze 24.0.1312.57). V podstatě nefunguje vše, co používá flash, já se snažil rozběhnout uploadify. FF bězí, Opera běží. Problém byl zde:
<?php
class MFUUIUploadify extends MFUUIBase {
	public function isThisYourUpload() {
		return (
			\Nette\Environment::getHttpRequest()->getHeader('user-agent') === 'Shockwave Flash'
			AND isSet($_POST["sender"])
			AND $_POST["sender"] == "MFU-Uploadify"
		);
	}
...
}
?>

Chrome neposílá user-agent ‚Shockwave Flash‘, ale klasický (Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17), protože má flash integrovaný přímo.

Jinak moc děkuju všem co jsem na tomto pluginu podíleli, usnadní to ostatním spoustu práce.

Editoval dada-amater (1. 3. 2013 14:26)

Matúš Matula
Člen | 257
+
0
-

Ahoj, dik za report.
O tom bugu s escapovanim riadiacich znakov som vedel aj ho fixol, akurat som to pozabudol na 1 mieste opravit, teraz by to malo fungovat.
Detekciu interface s flashom som upravil. Aktualna verzia je na githube.

Edit: ta chyba zrejme pretrvava pre SQLite (SQLite3 funkcne), ale nemam ju na serveri a teda ako otestovat.

Editoval Matúš Matula (20. 2. 2013 21:19)

Honza Kuchař
Člen | 1662
+
0
-

Oznamuji, že doplněk je nově dostupný na githubu. SVN repozitář je zatím pořád funkční, vyvíjet se však bude v GITu.

Těším se na pull requesty, forky a všechny další vymoženosti, které GIT přináší.

Používáte-li svn:externals, tento článek je určený pro vás.

(V případě, že bych dělal něco proti GIT-best-practices, prosím upozorněte mě na to, jsem GIT-zelenáč)

koren
Člen | 59
+
0
-

Ahoj.
Už se to tu určitě někdy nakouslo, ale neměli byste prosím zprovozněnou nějakou lightweight verzi MultipleFileUploadu pro Nette 2 s NDB? Zkoušel jsem se zorientovat v tomto balíku https://github.com/Ciki/MFU a pokusil se přepsat si model, ale přijde mi, že je tam spoustu věcí navíc, a to mi (jakožto ne uplně advanced vývojáři) bohužel brání tomu zcela porozumět a rozběhnout. Takže hledám nějaký takový sandbox s touto komponentou, něco takového přehledného jako je verze pro MFU Nette 0.9.

Pokud by někdo něco takového měl, bylo by to vážně super a určitě by to pomohlo i spoustě dalším lidem.
Díky moc.

Matúš Matula
Člen | 257
+
0
-

Ahoj, pozri na https://github.com/…FU/downloads, je tam starsi .zip len potrebnych suborov pre MFU.. podla nich vies, kt. subory su ozaj nevyhnutne pre MFU a mozes ich z toho balastu naokolo vytiahnut a zacat sa hrat :-) V podstate je ale vsetko potrebne v README.
S NDB nerobim, takze v tomto smere nepomozem.
Keby som mal niekedy cas, tak skusim ten balast z toho repa odstranit ;-)

Honza Kuchař
Člen | 1662
+
0
-

Na oficiální verzi pro Nette 2.0 pracuji (nebo spíš pracujeme; učím se s GITem). Budou se slučovat již napsané kódy a vznikne MFU pro Nette 2.0. Zatím postupuj podle závislostí… https://componette.org/search/?… tj. pokračuj s verzí Matúše na githubu. ;-)

dada-amater
Bronze Partner | 52
+
0
-

Muzu poprosit o podporu pro Composer? Snazim se ho pouzit pro muj projekt a tohle by bodlo. Je to paradni vec. Je to hotovy za par minutek.

Honza Kuchař
Člen | 1662
+
0
-

Založil jsem na Githubu větev pro Nette 2.0. Jedná se o kód ve velmi rané fázi, tedy není pořádně otestovaný. Snažím se postupně začleňovat commity od Cikiho do větve pro Nette 2.0.

Budu rád za jakékoli připomínky i případné pull requesty.

Co je teď v plánu:

  • composer
  • lepší organizace souborů ve složce www
  • opravdu mít MFU ve složce components v appDir?
  • přidání ovladače pro SQLite 3 (Ciki již napsal, zbývá jen začlenit do repa)
  • vymyslet lepší způsob konfigurace celé komponenty? (vlákno: https://github.com/…cb995a141f76)
voda
Člen | 561
+
0
-
  • lepší organizace souborů ve složce www
  • opravdu mít MFU ve složce components v appDir?

Ahoj, já bych nejraději organizaci souborů viděl takto:

  • app/components/MultipleFileUpload bych přesunul do složky src (a nejlépe podle PSR0)
  • pokud jsou ve www pouze externí závislosti, tak odstranit
  • složky app, libs, log,… odstranit
Honza Kuchař
Člen | 1662
+
0
-

app/components/MultipleFileUpload bych přesunul do složky src (a nejlépe podle PSR0)

Asi jsem nechápavý, kde by ta složka podle tebe měla být? V libs? PSR0 zatím asi nepřipadá moc v úvahu, když MFU (zatím!!) nepoužívá namespaces…

pokud jsou ve www pouze externí závislosti, tak odstranit

Tady nerozumím vůbec – jaké externí závislosti? Jsou tam soubory, které jsou od jednotlivých interface MFU (uploadify, plupload, …)

složky app, libs, log,… odstranit

To repo slouží zároveň jako příklad – to už teď není v módě? Je fajn, že se to vyvíjí společně…

voda
Člen | 561
+
0
-

Navrhuji jen to, aby v repositáři byly soubory, které patří k MFU.

To repo slouží zároveň jako příklad – to už teď není v módě?

To doufám nebylo nikdy v módě. Důvody proč to tam podle mne nepatří:

  1. Velikost. Teď má naklonovaný repositář přes 5MB, pokud budu ve svém projektu používat 10 doplňků a s každým se mi bude stahovat Nette, dibi, adminer, …, tak z toho nebudu nadšen.
  2. Log. Pokud se podívám např. na commit 79c5ba, tak z logu vůbec nepoznám co měnilo. Jestli to je jen nakopírovaná knihovna, nebo jestli tam byly i nějaké úpravy kvůli kompatibilitě, …

Pokud chceš poskytovat i funkční demo, tak bych pro něj udělal vlastní repo, podobně jako má Nette sandbox.

Honza Kuchař
Člen | 1662
+
0
-

Oddělit MFU a příklad je určitě rozumné…

Však nedovedu si dost dobře představit oddělovat zdrojáky například pluploadu a interface plupload v MFU. Ono to musí držet veze pohromadě…

Taky by bylo fajn, aby si člověk mohl už při includování repa do svého projektu nějak vybrat, které interfaces tam chce a které modely tam chce. Vzhledem k tomu, že nejsem git-geek, tak mě žádné řešení nenapadá… Však vypadá to, že by tím vzniklo 4 repa pro interfaces + 4 repa pro modely + repo pro MFU; přijde mi to jako dělo na komára… Nebo myslíš, že je to rozumné? Vzhledem k množství repozitářů by bylo asi nejlepší založit organizaci, jak to má Nette… A vyzná se v tom potom někdo?

Má smysl u doplňku opravdu takováto struktura repozitářů?

  • MultipleFileUpload: Example application
    • MultipleFileUpload
      • MultipleFileUpload: Model: SQLite
      • MultipleFileUpload: Model: SQLite3
      • MultipleFileUpload: Model: Dibi
      • MultipleFileUpload: Model: Log
      • MultipleFileUpload: Interface: SwfUpload
      • MultipleFileUpload: Interface: Uploadify
      • MultipleFileUpload: Interface: Plupload
      • MultipleFileUpload: Interface: HTML4SingleUpload
hrach
Člen | 1838
+
0
-

Jako clovek, ktery tento doplnek nepouziva a ani moc neplanuju, zkusim napsat muj nazor k architekture.

Zkracene: Architektura je uplne spatne. :D

Dlouze: Doplnek pro upload by vubec nemel resit databazovou vrstvu. Tecka. Cele bych to vyhazel. Jestli to dobre chapu, je to jen backend pro samotnou komponentu. Urcite to nejde udelat bez toho? Ja plupload takto uspesne provozuju bez problemu (vcetne chunkovani), jako standardni form prvek. Tim se ti dost snizi pocet nutnych repozitaru, cela komponenta se krasne procisti a hlavne, bude delat to, co se po ni zada (chcu upload, proc bych kvuli tomu mel mit db?). Dale bych zalozil organizaci. Jednotlive interface jsou jednotliva repa. Dale take repo demo (tzn. oddelit). A hlavne, interface pro html4 bych dal nativne do zakladniho balicku + dulezite info, nikde jsem nenasel, pridal bych do nativniho balicku interface pro html5. Toz se ti repa docela zjednodussi:

  • mfu/mfu
  • mfu/plupload
  • mfu/uploadify
  • mfu/swfupload
  • mfu/demo
voda
Člen | 561
+
0
-

Však nedovedu si dost dobře představit oddělovat zdrojáky například pluploadu a interface plupload v MFU. Ono to musí držet veze pohromadě…

Proč, kvůli různým verzím? Pokud napíšeš někam do poznámky s jakou verzí pluploadu to funguje (s jakou verzí to je testováno), tak není potřeba tam mít přímo soubory pluploadu.

Však vypadá to, že by tím vzniklo 4 repa pro interfaces + 4 repa pro modely + repo pro MFU

To by bylo asi „správné“ řešení, ale bylo by s tím už zbytečně moc práce, takže bych to klidně nechal v jednom repositáři.

Honza Kuchař
Člen | 1662
+
0
-

Hrachu, není to pravda, každá architektura má nějaký důvod a určitě není správně ji shazovat, jen proto, že ten důvod neznáš. Myslíš, že jsem se tak rozepisoval jen tak z plezíru?

MFU řeší problém, když potřebuješ odesílat data například v administraci. Jsi-li autentizován máš svoji session. Problém je v tom, že upload neprovádí vždy prohlížeč, ale například flash. Ten si posílá cookies jaké chce a nedá se na to spolehnout. MFU tedy musí chytat data ještě před startem session, jinak by jsi byl odhlášen. A k tomu potřebuje nějak uložit identifikační tokeny a k nim přiřazené soubory.

Úplně původně MFU využívalo cache Nette. Problém je v tom, že toto použití je chybné. Do cache smíš ukládat jen to, co jsi schopen kdykoli znovu vypočítat. Což tu neplatí.

Potom využívalo přímý přístup do adresáře cache, kde si dělalo vlastní soubory, což bylo úplně zcestné. A navíc tu byl problém s atomicitou při vícevláknovém odesílání. Občas se něco ztratilo. (což se s cache dělo taky)

Potom vznikla myšlenka driverů, že si bude moci každý uložit tyto metadata kam chce. A to je důvod.

Chtělo by to nějak zpřehlednit API, aby si to byl každý schopen jednoduše přepsat pro svoje modely. Však je tam ten striktní požadavek na atomicitu a to se ukázalo jako největší překážka.

Najednou to nesmysl není. Drivery jsou opodstatněné.

@voda:

  • Verze knihoven. Chtěl jsem, aby to fungovalo prostě po stažení repozitáře.
  • Zatím bych to rozdělil na dva. Example a MFU. Nad těmi dalšími ještě popřemýšlím.
hrach
Člen | 1838
+
0
-

Honza Kuchař napsal(a):
každá architektura má nějaký důvod

že má něco nějaký důvod ještě neznamá, že je to správně

Myslíš, že jsem se tak rozepisoval jen tak z plezíru?

To stejné platí o mém postu ;)

MFU řeší problém, když potřebuješ odesílat data například v administraci.

Je jedno. Jde prostě o to, že máš session. Tu můžeš mít a ani nebudeš přihlášen.

Problém je v tom, že upload neprovádí vždy prohlížeč, ale například flash. Ten si posílá cookies jaké chce a nedá se na to spolehnout. MFU tedy musí chytat data ještě před startem session, jinak by jsi byl odhlášen. A k tomu potřebuje nějak uložit identifikační tokeny a k nim přiřazené soubory.

Jasný, ale to vůbec nesouvisí s tím, že to ukládáš do db.

Úplně původně MFU využívalo cache Nette. Problém je v tom, že toto použití je chybné. Do cache smíš ukládat jen to, co jsi schopen kdykoli znovu vypočítat. Což tu neplatí.

souhlas.

Potom využívalo přímý přístup do adresáře cache, kde si dělalo vlastní soubory, což bylo úplně zcestné. A navíc tu byl problém s atomicitou při vícevláknovém odesílání. Občas se něco ztratilo. (což se s cache dělo taky)

Do adresáře cache je to zcestné, patří to do adresáře temp. Ohledne vicevlaknoveho odesilani – nenasel jsem zadnou zminku o tom, ze by nejaky interface umel odesilat vice chunku zaraz. Pokud je to mysleno ve smyslu, ze mam vice komponent na strance, nevidim v tom problem. Z meho pohledu je disk stejne bezpecne uloziste jako db (ktera je konec koncu taky na disku).

Navic, ohanis se atomicitou a pritom kdyz se podivam na dibi driver vubec nechapu tuto cast kodu:

Dibi::begin();
$where = array(
	"queueID%s" => $this->getQueueID(),
	"name%s" => $name
);
$this->query('UPDATE files SET ',array("chunk"=>$chunk),'WHERE %and',$where);
if($file) {
	$this->query('UPDATE files SET ',array("data"=>base64_encode(serialize($file))),'WHERE %and',$where);
	// workaround: https://forum.dibiphp.com/cs/1003-pgsql-a-znak-x00-oriznuti-zbytku-vstupu
}
Dibi::commit();

Vzdyz to jde takto i bez transakci

$where = array(
	'queueID%s' => $this->getQueueID(),
	'name%s' => $name,
);
$update = array(
	'chunk' => $chunk,
);
if ($file) {
	$update['data'] = base64_encode(serialize($file));
}
$this->query('UPDATE files SET ', $update, 'WHERE %and', $where);

Fakt netusim, jestli mi neco unika, nebo te tu budu skolit z pouzivani dibi.

Honza Kuchař
Člen | 1662
+
0
-

že má něco nějaký důvod ještě neznamá, že je to správně

Pořád lepší řešení nevidím…

Myslíš, že jsem se tak rozepisoval jen tak z plezíru?

To stejné platí o mém postu ;)

Dobrý smeč! :-)

Je jedno. Jde prostě o to, že máš session. Tu můžeš mít a ani nebudeš přihlášen.

Právě. Tu session to poruší, proto je třeba předávat vlastní token a session simulovat pomocí něj ještě před tím, než se session zavede a potom skončit.

Jasný, ale to vůbec nesouvisí s tím, že to ukládáš do db.

Výchozí je SQLite, je v tom problém? Cache v nette taky užívá sqlite jako svůj index. Výhoda je, že je to rychlé a jednoduché na implementaci…

Do adresáře cache je to zcestné, patří to do adresáře temp.

S adresářem cache jsem se spletl. Myslel jsem temp.

Ohledne vicevlaknoveho odesilani – nenasel jsem zadnou zminku o tom, ze by nejaky interface umel odesilat vice chunku zaraz. Pokud je to mysleno ve smyslu, ze mam vice komponent na strance, nevidim v tom problem. Z meho pohledu je disk stejne bezpecne uloziste jako db (ktera je konec koncu taky na disku).

Nene, více chunků ne, ale umí posílat více souborů zároveň.

Navic, ohanis se atomicitou a pritom kdyz se podivam na dibi driver vubec nechapu tuto cast kodu:

Fakt netusim, jestli mi neco unika, nebo te tu budu skolit z pouzivani dibi.

Díky za upozornění. Chce to refactoring. Driver jsem nepsal já a byl psán analogicky v sqlite driveru… Tedy nevyužívá všech pěkných vlastností dibi. Než vyjde oficiální verze pro Nette 2.0, projdu to.

hrach
Člen | 1838
+
0
-

Honza Kuchař napsal(a):

Jasný, ale to vůbec nesouvisí s tím, že to ukládáš do db.

Výchozí je SQLite, je v tom problém? Cache v nette taky užívá sqlite jako svůj index. Výhoda je, že je to rychlé a jednoduché na implementaci…

Už hodně dlouho ne, FileJournal je B(+?) strom.

Je jedno. Jde prostě o to, že máš session. Tu můžeš mít a ani nebudeš přihlášen.

Právě. Tu session to poruší, proto je třeba předávat vlastní token a session simulovat pomocí něj ještě před tím, než se session zavede a potom skončit.

Hele, to chapu, porad ale v tom nevidim souvislost, proc neukladat soubory na disk.

Driver jsem nepsal já a byl psán analogicky v sqlite driveru… Tedy nevyužívá všech pěkných vlastností dibi.

Nevidim duvod, proc by to nemelo jit v sql driveru, je to proste dotaz na stejnou tabulku se stejnou podminku, jde jen o jeho sestaveni.

Moje komponenta pro Plupload vyuziva toto nastaveni:

{"multipart_params":{"guid":"random string vygenerovany komponentou"},"unique_names":true}

Diky tomu to muzu cpat do jednoho adresare. Tam se soubory nauploaduji (chunkama) a po odeslani formu se teprve sestavi Nette\Http\FileUpload, ktery ma i spravne filename, pac to Plupload posle v $_POST.

Ohledne Session – to zrejme je problem, ale zajimave je, ze jsem se s nim nesetkal a zrejme ho neresil (nepamatu ji si, komponenta ma pres 2 roky).

Honza Kuchař
Člen | 1662
+
0
-

Čtu si to po několikáté a pořád vůbec nechápu, co vlastně chceš. Vím jen, že si myslíš, že je něco špatně, ale pořád nerozumím tomu co vlastně a hlavně proč. Zkus to prosím popsat nějak srozumitelněji. Proč si myslíš, že je špatně, že si komponenta chce uložit někam informace, které potom nemusí složitě dolovat? Proč si je nemůže uložit třeba do sqlite? Proč nemůže dát volnost programátorovi v podobě driverů?

session a soubory

Soubory se ukládají přímo na disk, jen meta-informace (tj. do které fronty patří a kolik ho zatím dorazilo) se ukládají přes driver. Vůbec netuším, jaký vidíš rozdíl v tom, jestli si komponenta vytvoří několik složek a do nich soubory s metadaty a k tomu uploadované soubory. Nebo jestli si všechny informace uloží do jednohou souboru (sqlite) a potom už se stará jen o uploadované soubory. Nehledě na to, že použiji-li již něco co je odladěné (sqlite), nemusím ladit něco opět od píky.

dibi driver a drivery vůbec

Ano jde to napsat jednodušeji, ale výsledek je ekvivalentní.

nastavení pluploadu

MFU používá normálně názvy souborů s tím, že na disk ukládá sha1($token . $chunks . $fileNameOriginal), aby se vyhnulo speciálním znakům. MFU by také mohlo všechno ukládat do jednoho adresáře, stačilo by, aby název souboru prefixoval název fronty.

Problém s flashem a cookies:

http://forums.asp.net/…57515.aspx/1
V zásadě jde o to, že všechny prohlížeče posílají pro požadavky z flashe cookie Internet Exploreru.

koren
Člen | 59
+
0
-

Hezky se to dalo do pohybu :) Moc se tesim az to bude hotovy, tahle vec je vazne potreba! Dik

Honza Kuchař
Člen | 1662
+
0
-

Pustil jsem se do oddělení příkladu a komponenty samotné…

Narazil jsem však na problémy s GITem i Composerem, se kterými si zatím nevím rady. Pokud někdo tušíte, jak by se toto dalo vyřešit, prosím poraďte!

Problém s GITem. Po rozdělení nejsem schopen připojit do repa příkladu jen část repa komponenty – tedy není možné vytvořit odkaz na adresář. To mi působí značné problémy, protože nejsem schopen do www/MFU připojit složku s js, css, … a do libs/MFU samotné zdrojáky MFU, ale pouze celé repo. Tedy otázka je – je možné to udělat jinak, než založit dvě repa?!

//EDIT: Není toto řešení problému s GITem?

To samé s Composerem. Zdrojáky mají přijít do libs/MFU – v tom není problém. Ale co se složkou, která má přijít do složky www? Nepodařilo se mi nic najít ani na stránkách Composeru.


Při rozdělování jsem předělal adresářovou strukturu, doufám, že k lepšímu… Prosím o komentáře.

(a nyní přemýšlím, jak to celé ztotožnit s myšlenkou DI)

Honza Kuchař
Člen | 1662
+
0
-

Můžete vyzkoušet:

composer create-project jkuchar/multiplefileupload-example mfu-example dev-master

Balíček samotného MFU, jestli jsem správně vyrozuměl, nemůže existovat, dokud nebude composer.json v masteru. Tedy je nejdříve potřeba dodělat tu verzi pro Nette 2.0.

Tomáš Votruba
Moderator | 1114
+
0
-

Skvělý, díky za úpravy, brzy vyzkouším.

koren
Člen | 59
+
0
-

Ahoj, jakpak to vypadá s vývojem? ;)

Honza Kuchař
Člen | 1662
+
0
-

Jak to myslíš? ;-)

koren
Člen | 59
+
0
-

Rád se budu mýlit, ale měl jsem pocit, že se tu řešil vývoj verze MFU pro Nette 2.0 fungující s NDB, a že to kvůli nějakým problémům usnulo. Pokud jsem to pochopil špatně, tak se omlouvám, mám radost a beru zpět ;) Přesto jsem teď ale trochu zmatený… :)

Honza Kuchař
Člen | 1662
+
0
-

Je to tak, že v současné chvíli existuje vývojová verze pro Nette 2.0. (je to vlastně jen upravená původní verze + clenup) Najdeš ji na Githubu zde: https://github.com/…leFileUpload

Chceš-li si to rozjet i s příkladem, použij composer: https://forum.nette.org/…form-control?p=8 a nebo si jej stáhni z https://github.com/…oad-example/

Už je to jasné? :-)

Každopádně větev pro Nette 0.9 bylo odsunuta na postranní větev.

ryvova
Člen | 9
+
0
-

A je už driver pro Database? Nějak ho v githubu nemůžu najít :-(.

Prado
Člen | 21
+
0
-

koren měl asi na mysli NetteDatabase, která je součástí Nette2 a nikoliv dibi. Samozřejmě, nejlepší by bylo pracovat prostě s cache a nevymýšlet kolo.

Jinak upozorňuji, že objekt SQLiteDatabase už v současné verzi PHP nelze získat, takže implicitní metoda nefunguje a měla by být když ne odebrána, tak změněna na alternativní nebo upgradována (ciki to tuším u sebe má).