MultipleFileUpload
MultipleFileUpload (zkráceně MFU) je doplněk pro Nette Framework, který vašim uživatelům umožní pohodlně, jednoduše a interaktivně odesílat hromady souborů. Komfort nabízí nejen uživateli, ale i programátorovi. Uživatel může na pár kliknutí odeslat celé fotoalbum a programátorovi stačí na implementaci tohoto doplňku pouhé 2 řádky kódu. Navíc tento doplněk podporuje AJAX pro maximální rychlost a uživatelské pohodlí! I na uživatele se staršími prohlížeči se myslelo. Pokud prohlížeč nesplňuje minimální požadavky, uživatel může odeslat soubory standardním způsobem.
| Autor doplňku | Honza Kuchař |
| Autor driver(ů) | Honza Kuchař (sqlite a log driver), Martin Sadový (dibi driver) |
| Inspirováno | http://forum.nette.org/…iewtopic.php?… |
| Licence | New BSD License |
| Diskuse | http://forum.nette.org/…form-control |
| Demo | http://multiplefileupload.projekty.mujserver.net/ |
| Stav | Ve vývoji. Viz kapitola „Známé problémy“ |
| Nette | viz závislosti |
Instalace
- Zkopírujte následující soubory:
- app/controls/MultipleFileUpload
- document_root/css/uploadify.css
- document_root/images/*
- document_root/js/*
- document_root/swf/*
- Do bootstrapu za registraci RobotLoaderu
a před
$application->run();přidejte následující řádku.MultipleFileUpload::register();Tímto krokem načtete a zaregistrujete Multiple File Upload.
Pokud používáte Nette 0.9.2 nebo nižší, čtěte zde: http://forum.nette.org/…sunu-souboru . V Nette 0.9.3-RC je už tato „chyba“ opravena. http://github.com/…2f8ae53e84a1
Pokud na vašem serveru běží PHP pod (Fast)CGI, je doporučená verze Nette 0.9.4. V této verzi je už opravené získávání hlaviček. Viz http://github.com/…e84a260119db.
A potom už můžete začít Multiple File Uploader používat.
Použití
$f = new AppForm($this,$name);
$f->addMultipleFileUpload("pokus1","Testík",20)
->addRule("MultipleFileUpload::validateFilled","Musíte odeslat alespoň jeden soubor!")
->addRule("MultipleFileUpload::validateFileSize","Soubory jsou dohromady moc veliké!",1024); // 1 KB
Do formuláře je potřeba opravdu zadávat přímo callback, protože ZATÍM není podporována validace na straně klienta!
Jako hodnotu MFU ve formuláři dostanu pole ve kterém je každý soubor validní (prošel HttpUploadedFile::isOK()) a je instancí HttpUploadedFile. Všechny soubory co zůstanou v tempech po odeslání formuláře budou smazány.
Takto vypadá pole co dostanete ke zpracování ($hodnoty =
$form->getValues();):
array(1) {
0 => object(HttpUploadedFile) (5) {
"name" private => string(15) "application.ini"
"type" private => string(24) "application/octet-stream"
"size" private => int(164)
"tmpName" private => string(107) "xxx"
"error" private => int(0)
}
}
Vzhled prvku můžete upravovat v šablonách
MultipleFileUpload-withJS.phtml a
MultipleFileUpload-withoutJS.phtml. Popřípadě zde můžete
i měnit nastavení uploadify.
Podpora v prohlížečích
| OS | Prohlížeč | Verze | Kvalita podpory | Komentář |
|---|---|---|---|---|
| Win7 | Google Chrome | 2 | ***** | Bez výhrad |
| 4.1.249.1025 beta | ***** | Bez výhrad | ||
| Opera | 10.0 | ***** | Bez výhrad | |
| 9.65 | ***** | Bez výhrad | ||
| Firefox | 3.5 | **** | O něco pomalejší než Google Chrome a Opera. Možná je to ale způsobeno nějakým nainstalovaným doplňkem. | |
| 3.6 | **** | O něco pomalejší než Google Chrome a Opera. Možná je to ale způsobeno nějakým nainstalovaným doplňkem. | ||
| Internet Explorer | všechny | – | Mezi soubory z nějakých důvodů chvíli čeká. Potřeba ošetřit několik chyb v IE/Flash, aby MFU vůbec fungovalo. (viz „Závislosti“) | |
| 8 | *** | Soubory odesílá klidně v deseti vláknech. (ale každé vlákno vždy chvíli čeká) Tzn. funguje to v celku správně. | ||
| WinXP | 6 | * | Soubory odesílá pouze v jednom vlákně. Tzn. taky to nějak funguje. |
Pokud není váš prohlížeč v předcházející tabulce, tak prosím napište na fórum, zada ve vašem prohlížeči MFU funguje, či nikoli. A pokud ano, tak jak.
Závislosti
- minimální verze Nette 0.9.1, 0.9.2 (nutnost přepsat HttpUploadedFile::move())
- doporučená verze Nette 0.9.3
- JavaScript: jQuery, Uploadify, swfobject.js, livequery, upravený ajax-form driver
- originální
jquery.uploadify.jsnefunguje s Internet Explorerem, protože má v id objektu pomlčku. IE to interpretuje jako mínus. Proto jsem vydal upravenou verzi, kterou najdete na svn ve složcetrunk/document_root/js/. (od rev. 19) - originální
swfobject.jsnefunguje v Internet Exploreru, protože Internet Explorer má bug s flashem ve formuláři. Upravenou verzi tohoto souboru najdete na svn ve složcetrunk/document_root/js/. (od rev. 20)
Známé problémy
- blíže nespecifikovaný problém na počátačích se systémem Mac
Drivery
Driver má za úkol skladovat informace o přenesených souborech a samotné soubory. V Multiple File Uploadu se driverů nachází hned několik.
Jak zaregistrovat vlastní driver? Mrkněte do bootstrapu v distribuci.
| Driver | Autor | Licence | Umístění | Thread-safe | Popis | Instalace | Stav |
|---|---|---|---|---|---|---|---|
| SQLite v. 2 | Honza Kuchař | New BSD | distribuce | ano | Ukládá informace o přenesených souborech do databáze SQLite. (využívá php_sqlite; nevyžaduje dibi) | Stačí povolit zápis (chmod(0777)) ve složce app/controls/drivers/Sqlite/database.sdb. | Doporučený, Stabilní |
| Dibi | Martin Sadový (prvotní implementace) + Honza Kuchař (učesáno; přidán workaround pro http://forum.dibiphp.com/…bytku-vstupu?…) | New BSD | distribuce | ano | Ukládá informace o přenesených souborech do jakékoli databáze, kterou podporuje Dibi. (vyžaduje Dibi; tabulku musíte v databázi ručně vytvořit; v distribuci přiloženy dumpy databází mysql (Martin) a postgres (Honza)) | Zprovozníte dibi, vytvoříte tabulku files v databázi. (viz dumpy databází) | Experimentální (nejspíš si ho budete muset poupravit právě pro vaši databázi, ale bez úprav by to mělo fungovat pod MySQL a PgSQL) |
| Log | Honza Kuchař | New BSD | distribuce | ano | Nikam nic neukládá. Slouží pro vývojáře k zjištění pořadí volaných metod v driveru. Pro běžného uživatele nemá žádný význam. | Nakonfigurovat Logger. (viz doplňky) | Stabilní |
Demo
http://multiplefileupload.projekty.mujserver.net/
SVN
https://svn.mujserver.net:8443/…pload/trunk/
(verze pro PHP 5.2.x) (uživatel: guest, heslo: (nechat
prázdné))



