Jak nabídnout soubor ke stažení

Článek popisuje techniku zdrojového kódu v PHP, který při přístupu uživatele na stránku vytvoří dialogové okno stahování souboru.


Abychom vyvolali dialog stahování souboru při přistupu na stránku, musíme to prohlížeči sdělit sadou hlaviček. Nakonec pošleme na výstup soubor pomocí funkce readfile();.

  1. <?
  2. class File {
  3. public function __construct() { }   
  4. public static function forceDownload($file, $filename="", $params=array()) {
  5. if (!$filename) $filename=basename($file);       
  6. header("Pragma: public");
  7. header("Expires: 0");
  8. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  9. header("Cache-Control: private",false);
  10. header("Content-Transfer-Encoding: binary");
  11. header('Content-Description: File Transfer');
  12. header("Content-Type: ".self::getDownloadMimeType($filename));
  13. header("Content-Length: ".filesize($file));
  14. header("Content-Disposition: attachment; filename="".$filename."";");
  15. ob_clean();
  16. flush();
  17. readfile($file);
  18. if (!isset($params['exit']) || ($params['exit']==1)) exit;
  19. }
  20. public static function getDownloadMimeType($filename) {
  21. return "application/octet-stream";
  22. }
  23. }
  24. ?>

Uzavírat celou akci do třídy, popřípadě funkce není vůbec nutné, ale najdeme více funkcí, které budeme potřebovat v souvislosti se soubory a tak je výhodné vytvořit si takovou knihovnu s těmito funkcemi, proto jsem uvedl jen úryvek ze třídy File.

Celou akci pak používám tímto stylem: File::forceDownload("../cesta_k_souboru.txt");, defaultně je nastavené, že skript skončí ihned po vypsání souboru, to můžeme zrušit nastavením parametru v třetím argumentu funkce, což je pole a dovolí pracovat s více možnými parametry.

Funkci getDownloadMimeType($filename), bychom mohli rozšířit o různé hlavičky určující obsah souboru, ale ve většině případů si vystačíme s hodnotou application/octet-stream. Dle mých testů, by to mělo fungovat v každém prohlížeči.

 

podobné články

25.11.2009Jak nabídnout soubor ke stažení v Nette(100%)

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
01.06.2008 18:29 | Anonym (rejpava starenka) | konstruktor

prazdny konstruktor je k necemu treba, nebo to je jen otazka zvyku.. ;) ?

ps. pekne cteni..

02.06.2008 12:40 | Administrátor | Re: konstruktor

zvyk, asi pozůstatek z javy :)

22.11.2008 07:24 | Anonym (pinokio88) | Hezke...

Presne toto jsem potreboval. Suprove napsane, prehledne, dobry popis ze i vim co k cemu slouzi.

Velke diky :-)

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>