File Downloader
Dopolněk na jednodušší stahování souborů. Podporuje navazování přerušeného stahování, segmentové stahování, soubory nad 4GB, automatické zjištění mimetypu souboru, češtinu a mezery v názvech souborů a obsahuje omezovač rychlosti stahování.
| Verze | 1.0.0, 1.1.0, dev (trunk na SVN) |
|---|---|
| Download | viz níže |
| Autor | Jan Kuchař |
| Licence | New BSD License |
| Stánka doplňku | http://filedownloader.projekty.mujserver.net |
| Diskuse k doplňku | http://forum.nette.org/…e-downloader |
| Demo | http://filedownloader.projekty.mujserver.net/demo/ |
| Testováno na Nette | 0.9.x, 2.0 (komunita říká, že funguje) |
| PHP | 5.2, 5.3 |
| Namespace | nemá, pokud máte Nette s namespaces budete muset použít a) upravenou verzi (rev 44) b) Si verzi vygenerovat pomocí AutoUse. |
Pokud plánujete ze serveru stahovat veliké soubory
(>2GB) přes File Downloader, povolte rozšíření cUrl.
File Downloader sice stahování velikých souborů provede i bez cUrl, ale
bude server zbytečně zatěžovat. (kvůli chybě v PHP, se musí obcházet
fce fseek() použitím fread())
File Downloader nyní závisí na třídě BigFileTools, kterou najdete v distribuci v adresáři libs.
Základní použití
Chceme stáhnout soubor.
$filedownload = new FileDownload;
$filedownload->sourceFile = "source.txt";
$filedownload->download();
Fluent interface
Zde je to samé, za použití fluent interface
FileDownload::getInstance()
->setSourceFile("source.txt")
->download();
Pokročilé použití
Omezovač rychlosti
$filedownload = new FileDownload;
$filedownload->sourceFile = "source.txt";
// Nastavíme rychlost odesílání v bytech
$filedownload->speedLimit = 5 * FDTools::BYTE;
$filedownload->download();
Fluent interface
FileDownload::getInstance()
->setSourceFile("source.txt")
// Nastavíme rychlost odesílání v bytech
->setSpeedLimit(5*FDTools::BYTE)
->download();
Název odesílnaného souboru
V tomoto příkladu se soubor odešle jako test.txt
$filedownload = new FileDownload;
$filedownload->sourceFile = "source.txt";
$filedownload->transferFileName = "test.txt";
$filedownload->download();
Fluent interface
FileDownload::getInstance()
->setSourceFile("source.txt")
->setTransferFileName("test.txt")
->download();
Ruční určení mime-typu
Soubor se odešle s mime typem pdf souboru
$filedownload = new FileDownload;
$filedownload->sourceFile = "source.txt";
$filedownload->mimeType = "application/pdf";
$filedownload->download();
Fluent interface
FileDownload::getInstance()
->setSourceFile("source.txt")
->setMimeType("application/pdf")
->download();
Zobrazení souboru přímo v prohlížeči
Přidáno ve verzi 1.0.0
$filedownload = new FileDownload;
$filedownload->sourceFile = "source.txt";
$filedownload->contentDisposition =
FileDownload::CONTENT_DISPOSITION_INLINE;
$filedownload->download();
Fluent interface
FileDownload::getInstance()
->setSourceFile("source.txt")
->setContentDisposition(
FileDownload::CONTENT_DISPOSITION_INLINE
)->download();
Callbacky – když …
FileDownloader podporuje callbacky. Tzn. například: když chci něco provést když se přeruší spojení, použiji callback abort. Registrace bude vypadat:
$filedownload = new FileDownload;
$filedownload->sourceFile = "source.txt";
// Registrace callbacku:
$filedownload->onAbort[] = "názevVolanéFunkce";
$filedownload->download();
nebo
FileDownload::getInstance()
->setSourceFile("source.txt")
// Registrace callbacku
->addAbortCallback("názevVolanéFunkce")
->download();
Tzn. callbacky registrujeme buď onCallback[] = callback; nebo
addCallbackCallback(callback); v fluent interface.
Přehled callbacků
| Název callbacku | Popis callbacku |
|---|---|
| BeforeDownloaderStarts | Než se spustí downloader |
| BeforeOutputStarts | Tesně před začátkem uploadu souboru (poslední možnost odeslat hlavičky) |
| StatusChange | Když se změní stav souboru – když se odešle blok souboru nebo každou sekundu když je stahování souboru bez omezení rychlosti |
| Complete | Když je stahování souboru úspěšně dokončeno |
| Abort | Když je stahování souboru přerušeno (typicky: uživatel klikne na storno) |
| ConnectionLost | Když se přeruší spojení (z jakéhokoli důvodu) |
| TransferContinue | Když se naváže přerušené stahování (začne se stahovat část souboru) |
| NewTransferStart | Když začne nové stahování od začátku souboru |
Parametry callbacku jsou následovné:
function onAbort(FileDownload $download,IDownloader $downloader){
/* ... */
}
Kdy je který callback volán hezky ukazuje příklad
form z repozitáře, ve kterém se volané callbacky vypisují na
obrazovku.
Požadavky na hosting
File Downloader používá dva „downloadery“. AdvancedDownloader vyžaduje možnost nastavení dlouhého času pro běh skriptu. Pokus se to nezdaří, provede se fallback na NativePHPDownloader, který ovšem od PHP 5.3 potřebuje tolik paměti, jaká je velikost souboru. Pokud někdo víte, čím by to mohlo být, prosím napište!
Callbacky se dají spolehlivě používat pouze u AdvancedDownloaderu, stejně jako nastavení rychlosti a podpora velkých souborů.
Krátká video ukázka
Živé demo
http://filedownloader.projekty.mujserver.net/demo/Získat File Downloader
https://svn.mujserver.net:8443/…loader/trunk
(verze pro PHP 5.2.x) (uživatel: guest, heslo: (nechat
prázdné))
Komentáře 
Honza Kuchař | 25. 1. 2010, 18:21 | comment
- Podpora pro IPresenterResponse přesunuta do samostatné třídy AppFileDownload
- Nový příklad: MVC – Používáme FileDownloader v Nette/Application
Honza Kuchař | 3. 4. 2011, 10:42 | comment
- podpora pro soubory >2GB
Honza Kuchař | 7. 5. 2011, 12:05 | comment
- vydána verze 1.1.0

Honza Kuchař | 25. 1. 2010, 15:36 | comment