streda, 08 február 2012 12:51 Written by 5840 times
Rate this item
(8 votes)

Odkaz na sťahovanie súborov z webu

Mnohí sa pri programovaní dynamických a aj statických webov stretnete s prípadom,
ked chcete naprogramovat na webovú stránku odkaz, z ktorého si má užívatel stiahnuť súbor.
Zdá sa to byt jednoduché? Naprogramujete odkaz pomocou tagu <A href="http://www.stahuj.sk/subory/Stiahnima.txt">Stiahnima.txt</A> a hotovo?

Niekedy to také jednoduché nie je, hlavne pri viacerých typoch operačných systémov a prehliadačov,
ktoré interpretujú HTML protokol odlišne a potom ste prekvapení, že na kamarátovom WIN 7 a prehliadač Opera alebo Mozilla ak chcete súbor z webu stiahnut, to potom nefunguje. Najviac to oceníte  vtedy, ak chcete sťahovat špecifické súbory, napr. súbory MS Office alebo iné.
Máme pre Vás malú radu ako veľmi rýchlo a efektívne naprogramujete takýto vždy fungujúci odkaz.  
Súbor môže byt uložený na Vašom serveri alebo aj na vzdialenom. Najlepšie je, aby ste pri odkazoch na súbory uvádzali vždy celú cestu k súboru, aby PHP interpreter mal čo najmenej roboty.

Poďme na to.

K dispozícii na ukážku máme dva súbory: download.php - ten urobí všetku špinavú prácu za Vás.
V ňom vidíte jednoduchú viacnásobnú podmienku, kde do HTTP protokolu uvediete presnejšie aký typ súboru má váš prehliadac potom po kliku stiahnuť.
Ďalšie koncovky súborov si môžete ľahko doprogramovať sami.
Najpodstatnejšia vec v tomto skripte je, že priamo píšete do hlavicky HTTP presnejšie údaje, ako nebrať obsah volaného skriptu predtým (no cache), 
čo má ponúknuť užívatelovi na stiahnutie (Content-Disposition: attachment;) atď.
Funkciou set_time_limit(0); si zabezpäčíme, aby pri sťahovaní súboru nebol predčasne ukončený výkon skriptu interpreterom PHP.
Nakoniec pomocou funkcie readfile prečítame obsah súboru na stiahnutie do tela protokolu HTTP a po ukončení vytorenia celého obsahu protokolu môže byť obsah poslaný po požiadavke klienta užívateľovmu prehliadaču.

 

/*******************************************************************************
 *  Programmed by: Ing. Alojz Bendak                                           *
 *******************************************************************************/
  extract($_GET);
  
  $filename = realpath($filename);
  if (!file_exists($filename))
  {
    echo "<CENTER>\n";
    echo "  <img src=\"./images/back.jpg\"; style=\"cursor='hand';\" onclick= \"history.back();\">\n<br>\n";
    echo "  <font color=red><b>NO FILE $filename HAS BEEN FOUND!\n";
    echo "</CENTER>\n";
    exit;
  }
  $file_extension = strtolower(substr(strrchr($filename,"."),1));
  switch ($file_extension)
  {
    //
    case "pdf": $ctype="application/pdf"; break;
    case "exe": $ctype="application/octet-stream"; break;
    case "zip": $ctype="application/zip"; break;
    case "doc": $ctype="application/msword"; break;
    case "xls": $ctype="application/vnd.ms-excel"; break;
    case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
    case "gif": $ctype="image/gif"; break;
    case "png": $ctype="image/png"; break;
    case "jpe":
    case "jpeg":
    case "jpg": $ctype="image/jpg"; break;
    default:    $ctype="application/force-download";
  }
  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  header("Cache-Control: private", false);
  header("Content-Type: $ctype");
  header("Content-Disposition: attachment; filename=\"".basename($filename)."\";");
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: ".@filesize($filename));
  set_time_limit(0);
  @readfile("$filename");

 

Druhý subor je index.php - môžete si ho ale ľubovolne premenovať. V ňom je napísané použitie súboru download.php v PHP blokoch.
Váš súbor na stiahnutie som pomenoval konštantou DOWNLOAD_FILE.

 

<?php
/*******************************************************************************
 *  Programmed by: Ing. Alojz Bendak                                           *
 *******************************************************************************/
 
 define('DOWNLOAD_FILE', 'download.php');
 
?>
<HTML>
  <HEAD>
    <TITLE>Download file test</TITLE>
  </HEAD>
  <BODY>
    <TABLE width="100%" border="0">
      <TR height="30" align="center">
        <TD>
          Download file:&nbsp;&nbsp;<a href="/download.php?filename="><?php echo DOWNLOAD_FILE; ?></a>
        </TD>
      </TR>
    </TABLE>
  </BODY>
</HTML>

 

Obidva súbory si vytvorte alebo prekopírujte najjednoduchšie do jedného adresára Vášho webového rozhrania.

No a nakoniec si stačí vyvolať v prehliadači súbor index.php a môžete si stiahnuť zdrojový súbor download.php klikom na odkaz download.php.  

Last modified on streda, 30 január 2013 08:43
Alojz Benďák

Autor je administrátor webu a venuje sa programovaniu takmer 23 rokov.

  • prvý kontakt s počítačmi na strednej škole - PMD 1,2,3, PP06, Atari, Sinclair (programovanie v jazyku: strojový kód, basic a pascal):  2 roky
  • na VŠ - jazyky Turbo pascal a Turbo C: 1rok
  • programovanie databázového ekonomického širokoškálneho software v Delphi a C++ Borland (databázy Paradox): 8 rokov v Codex s.r.o. Nitra
  • programovanie webových aplikácií na databázach MySQL a MS SQL server: 1 roky na živnosť (firmy: Hermes Nitra, Schindler v Bratislave)
  • pracoval ako DBA v Homecredit Brno a vo VÚB Bratislava ako vyvojár + optimalizácie v SQL a PL/SQL na Oracle 11g (firma Accenture)
  • programoval programy pre súkromné firmy pre HW na skenovanie povrchov nádrží pre skladovanie tekutých palív (pristroj Leica)
  • momentálne pracuje ako DBA pod Oracle 11g a ako vyvojár vnútropodnikových databázových aplikacií v PHP, SQL, C++, C# a interface v PL/SQL: 11 rokov
  • ďalej programuje s HTML, CSS, Ajax, Javascript, VBA, MS visual C++ a C# malé podporné aplikácie
  • certifikát SQL expert for Oracle 11g   
  • spolupracuje a aktívne učí pre počítačové firmy: Lapis, IVIT v Nitre

More in this category: Zoznam súborov v adresári »