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%)