Někdy potřebujeme znát počet stažení souboru (nebo alespoň klepnutí na odkaz). Jednou z možností je nenabízet soubor ke stažení přímo, ale odkazovat na skript, který nejprve započte jeden přístup (zvýší počítadlo stažení) a teprve poté přesměruje na soubor ke stažení.

Řada prohlížečů po přesměrování na soubor ke stažení zahájí stahování, ale neukáže adresu, odkud se ve skutečnosti stahuje. Pokud do skriptu doplníte kontrolu, zda je skript volán z patřičné stránky, poslouží vám to zároveň jako jednoduchá ochrana, aby mohl kdokoli jiný na své stránce odkazovat na váš soubor ke stažení. Pokud někdo takový odkaz umístí na svou stránku, místo souboru ke stažení je prohlížeč přesměrován na vaši hlavní stránku.

Stahování souboru by bylo možné vyřešit i jinak, než prostým přesměrováním – soubor by posílal sám skript s odesláním vhodných hlaviček. Toto se však hodí pro vyloženě malé soubory (malé obrázky apod.). Pro velké soubory o velikosti několika megabajtů je to nevhodné – zpravidla by doba povolená k běhu skriptu vypršela dříve, než si klient soubor stáhne.

Nejprve si v databázi vytvořte tabulku – v ní pak můžete mít nadefinováno ke stažení souborů kolik chcete. Tabulka s názvem DLOADS bude mít sloupce ID typu shortint s volbou auto_increment, loaded typu integer a path typu varchar(255). Pokud chcete nabízet ke stažení soubory různých typů a z různých adresářů, je nutné následující skript upravit. Ten počítá se stahováním souborů stejného typu z téže složky. Do řádku tabulky pak vkládáte pouze do sloupce LOADED 0 a do sloupce PATH jméno souboru včetně přípony.

Položka ID se naplní sama na číslo o jedna vyšší, než je poslední vložený soubor ke stažení. Hodnotu ID pak použijete v parametru odkazu na skript pro stažení souboru. Jelikož používáte prosté přesměrování na soubor ke stažení, nemůžete pomocí odeslání vhodných hlaviček sdělit prohlížeči, jak se souborem naložit.

Abyste se vyhnuli u klienta namísto zahájení stahování souboru spuštění nějaké aplikace (např. přehrávače záznamů v případě souborů mp3), přejmenujte soubor ke stažení tak, že změníte příponu na nějakou "exotickou" a při stahování souboru upozorníte klienta na nutnost přejmenování po ukončení stahování. Pokud naopak chcete, aby se klientovi řádně spustila jeho přidružená aplikace (např. Windows Media Player, WinAmp, Word nebo Acrobat Reader), důsledně dodržíte správnou příponu souboru určeného ke stažení a informační hlášení o přejmenování souboru nepoužijete.

Skript download.php:

<?PHP
$path="music/";  // cesta k adresáři se soubory ke stažení
$location="http://$HTTP_HOST/";  // adresa pro přesměrování na hlavní stránku
if (isset($dl) && ERegI("$HTTP_HOST",$HTTP_REFERER)) {  // otestuj, zda je zadán parametr požadovaného souboru a skript je volán ze správné stránky
  require("opendb.php"); // připoj se k databázi
  $dl=AddSlashes(Chop($dl)); // ošetři případné nebezpečné znaky parametru dl
  $result = @mysql_query("select path from dloads where id=$dl");
  $data = mysql_fetch_row($result);
  if (!empty($data[0])) {  // otestuj, zda pro zadaný parametr byla v databázi nějaká data
    @mysql_query("update dloads set loaded=loaded+1 where id=$dl");  // zvyš počet stažení o 1
    $location="http://$HTTP_HOST/$path$data[0]";  // nastav adresu pro přesměrování na soubor ke stažení
  }
}
Header("Location: $location"); // přesměruj prohlížeč
exit; // ukonči skript
?>

Upozorňuji, že součástí ukázkového skriptu není soubor opendb.php, který zajišťuje připojení k databázi pomocí PHP funkcí mysql_connect a mysql_select_db. Jejich použití je k vidění například v článku Jednoduchý internetový obchod v PHP, 1. díl. Na některých serverech není obsah proměnné $HTTP_REFERER korektní. Pokud se skript chová divně, zkuste vynechat v podmínce testování této proměnné – ochrana proti "zcizení" odkazu pak ovšem nebude funkční.

Do stránky pak vložte odkaz na soubor ke stažení. Součástí odkazu je parametr dl určující číslem soubor ke stažení a také ukázka vyskakovacího upozornění o nutnosti přejmenování souboru:

<a href="download.php?dl=1" onclick="alert(‚Po stažení změn příponu souboru na [*.mp3].\nOdkaz je chráněn proti umístění na cizí servery.‘);">Skladba 1</a>

Nechcete-li použít změněné přípony souboru, pak v odkazu pro stažení souboru vynechejte celý parametr OnClick. Tabulku databáze lze rozšířit o popisek souboru ke stažení a vytvořit skript, který automaticky vygeneruje stránku se všemi soubory ke stažení, s komentářem a s počtem dosavadních stažení.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět