Domů Programování Download pomocí PHP skriptu

Download pomocí PHP skriptu

204 6722

Jak mnozí jistě vědí, programovací jazyk PHP poskytuje široké možnosti programátorům, kteří programují webové stránky. Od jednoduchých podmínek pro větvení programu, ošetřování výjimek, zpracovávání formulářů, prací s COOKIES a SESSIONS, přes rozesílání emailů, po práci se soubory a hlavičkami dokumentů. A samozřejmě ještě spousta dalších možností. Dnes si ukážeme, jak pomocí PHP skriptu umožnit stahovat nějaký soubor.

 

Ukázkový skript

 

<?php

 

// funkce pro navraceni ocekavaneho content podle pripony souboru

function content_dle_pripony($pripona) {

 

  $ocekavany_content = 'application/octet-stream';

 

  if($pripona == 'doc')  {$ocekavany_content = 'application/msword';}

  if($pripona == 'exe')  {$ocekavany_content = 'application/octet-stream';}

  if($pripona == 'pdf')  {$ocekavany_content = 'application/pdf';}

  if($pripona == 'xls')  {$ocekavany_content = 'application/vnd.ms-excel';}

  if($pripona == 'pps')  {$ocekavany_content = 'application/vnd.ms-powerpoint';}

  if($pripona == 'ppt')  {$ocekavany_content = 'application/vnd.ms-powerpoint';}

  if($pripona == 'tar')  {$ocekavany_content = 'application/x-tar';}

  if($pripona == 'zip')  {$ocekavany_content = 'application/zip';}

  if($pripona == 'mp3')  {$ocekavany_content = 'audio/mpeg';}

  if($pripona == 'wav')  {$ocekavany_content = 'audio/x-wav';}

  if($pripona == 'bmp')  {$ocekavany_content = 'image/bmp';}

  if($pripona == 'gif')  {$ocekavany_content = 'image/gif';}

  if($pripona == 'jpe')  {$ocekavany_content = 'image/jpeg';}

  if($pripona == 'jpeg') {$ocekavany_content = 'image/jpeg';}

  if($pripona == 'jpg')  {$ocekavany_content = 'image/jpeg';}

  if($pripona == 'ico')  {$ocekavany_content = 'image/x-icon';}

  if($pripona == 'css')  {$ocekavany_content = 'text/css';}

  if($pripona == 'htm')  {$ocekavany_content = 'text/html';}

  if($pripona == 'html') {$ocekavany_content = 'text/html';}

  if($pripona == 'mpeg') {$ocekavany_content = 'video/mpeg';}

  if($pripona == 'mpg')  {$ocekavany_content = 'video/mpeg';}

  if($pripona == 'mov')  {$ocekavany_content = 'video/quicktime';}

  if($pripona == 'qt')   {$ocekavany_content = 'video/quicktime';}

  if($pripona == 'avi')  {$ocekavany_content = 'video/x-msvideo';}

 

  return $ocekavany_content;

 

}

 

// nazev souboru (i s cestou) a prevod cesty do pole

$soubor = './kestazeni/soubor.txt';

$cesta_pole = pathinfo($soubor);

 

// nastaveni pro nektere urcite prohlizece

if(ini_get('zlib.output_compression')) {ini_set('zlib.output_compression', 'Off');}

header("Pragma: public");

header("Expires: 0");

header("Cache-control: private", false);

header("Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0");

header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");                   

header("Content-Description: File Transfer");

 

// nejdulezitejsi cast skriptu

header("Content-Disposition: attachment; filename=\"".$cesta_pole[“basename”]."\"");     

header("Content-Type: " . content_dle_pripony(strtolower($cesta_pole[“extension”])) . "");

header('Content-Transfer-Encoding: binary');                      

header("Content-Length: filesize($cesta_nazev)");

 

// vycistit cache a precist soubor

ob_clean();

flush();       

readfile($soubor);

exit;

 

?>

 

Popis ukázky

První část kódu je funkce, která po zadání přípony vrátí předpokládaný content souboru. Samozřejmě můžete funkci doplnit o další přípony, jde pouze o ukázku, kde nejsou všechny. Celý kód, který čítá všechny podporované contents, má okolo 200 řádků.

 

V další části se připraví název souboru. Ten samozřejmě nemusíte získávat napevno, ale například pomocí načtení hodnoty z nějakého formuláře. Potom následuje taková "série různých opatření". Jelikož ne všechny webové prohlížeče mohou pochopit stejnou operaci stejně, je toto opatření na místě. Díky tomuto ošetření by se rozdíly měly snížit na minimum. Snad jen Content-Description je zde navíc, popis není povinný.

 

No a nyní přichází nejdůležitější část skriptu. Přes Content-Disposition předáme název souboru, přes Content-Type zase content souboru, který nám s výhodou obstará již připravená funkce. Je také dobré nastavit binární kódování (jinak by mohl nastat problém, u mě například s archivy ZIP a jinými formáty) a předpokládanou velikost.

 

No a úplně poslední částí je vyčištění cache a přečtení souboru. Tímto se obsah souboru naplní do bufferu, který právě stahujete. Kromě readfile je také možné přečíst soubor "po znacích" (typicky cyklem while dokud není konec souboru), ale readfile funguje stejně dobře a je to kratší. Kdybyste namísto readfile nechali vypsat do bufferu třeba nápis "ahoj", tak se Vám nestáhne soubor zadaný přes proměnnou $soubor, ale soubor o daném typu, jehož obsahem bude text "ahoj".

 

Závěr

Tento příklad by měl být co nejvíce univerzální a snaží se eliminovat rozdíly v chápání různými prohlížeči. Samozřejmě je vhodné funkci rozšířit o další přípony a cestu ke stahovanému souboru si zasílat například přes formulář. A to je pro dnešek vše.

204 Komentováno

Okomentujte článek