Manchmal will man einfach nur zählen, wie oft ein Programm oder ein Archiv heruntergeladen wird. Häufig will man auch verhindern, dass ein direkter Download von einer fremden Seite möglich ist. Ein erstaunlich kurzes Script schafft Abhilfe.
UPDATE
Wir haben uns die Zeit genommen und das Script zu einer ordentlichen Klasse ausgebaut, die auf Wunsch auch die Anzahl der bereits erfolgten Downloads ausgibt und den direkten Aufruf von einer Seite außerhalb der eigenen Domain verhindern kann.
- hier herunterladen dlcounter.zip
Das Paket einfach herunterladen und in einem Webordner enpacken. Im Paket findet sich auch ein Beispiel, das den Einbau in eigene Dateien zum Kinderspiel machen sollte.
Nicht vergessen!! der "./downloads" Ordner und die darin enthaltenen Dateien müssen durch PHP lesbar und schreibbar sein.
Das PHP Script
PHP Download Counter
<?php
/*
* Downloadcounter Kontrollscript
* Author Dirk Hoeschen (hoeschen at feenders.de)
*/
$path="./downloads/";
// hole dateinamen aus variable f
$f = @strip_tags($_GET['f']);
if ($f!="") {
// ganzes verzeichnis lesen
$dir_handle = @opendir($path) or die("Unable to open ".$path);
while ($file = readdir($dir_handle)) {
if (!is_dir($file)) {
if ($file==$f) {
rename($path.$file,$path."0:0:".$file);
$file = "0:0:".$file;
}
// datei in array splitten
$fparts = preg_split('/:/',$file);
if ((count($fparts)>1) && ($fparts[2]==$f)) {
// counter+1, zufallswert ermitteln, datei umbenenenn
$dlcount = intval($fparts[0])+1;
$frandom = hash("md5",microtime());
$newfilename=$dlcount.":".$frandom.":".$f;
rename($path.$file,$path.$newfilename);
break;
}
}
}
// datei mit dem ursprünglichen namen ausgeben
if (isset($newfilename) && ($newfilename!="")) {
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'.$f.'"');
header("Content-Transfer-Encoding: binary");
readfile($path.$newfilename);
}
}
?>
<?php
/*
* Downloadcounter Kontrollscript
* Author Dirk Hoeschen (hoeschen at feenders.de)
*/
$path="./downloads/";
// hole dateinamen aus variable f
$f = @strip_tags($_GET['f']);
if ($f!="") {
// ganzes verzeichnis lesen
$dir_handle = @opendir($path) or die("Unable to open ".$path);
while ($file = readdir($dir_handle)) {
if (!is_dir($file)) {
if ($file==$f) {
rename($path.$file,$path."0:0:".$file);
$file = "0:0:".$file;
}
// datei in array splitten
$fparts = preg_split('/:/',$file);
if ((count($fparts)>1) && ($fparts[2]==$f)) {
// counter+1, zufallswert ermitteln, datei umbenenenn
$dlcount = intval($fparts[0])+1;
$frandom = hash("md5",microtime());
$newfilename=$dlcount.":".$frandom.":".$f;
rename($path.$file,$path.$newfilename);
break;
}
}
}
// datei mit dem ursprünglichen namen ausgeben
if (isset($newfilename) && ($newfilename!="")) {
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'.$f.'"');
header("Content-Transfer-Encoding: binary");
readfile($path.$newfilename);
}
}
?>
Wie funktioniert es?
Dem Downloadscript wird über die Variable "f" (http://www.webseite.php/download.php?f=test.zip) der gewünschte Dateiname übermittelt. Das Script sucht nun im Unterordner "downloads" nach der Datei. Die Datei ist nach folgendem Muster gespeichert: ZÄHLER:HASH:DATEINAME.
Die Teile zwischen dem ":" werden aufgesplittet. Der Zähler wird um eins erhöht, ein neuer Hashwert generiert und die Datei umbenannt.
Dadurch ist ein Download der Datei nur über das Script möglich. Zusätzlich kann man über den Dateinamen ermitteln, wie oft die Datei heruntergeladen wurde. Das Script funktioniert nur mit ZIP-Dateien. Bei anderen Dateitypen muss es ergänzt werden.
Zugriffsbeschränkung
Bis jetzt funktioniert unser Script nur als Zähler. Außerdem verhindert es den direkten Download.
Wenn das Script in einem passwortgeschützten Bereich liegt oder über die Sessionvariable auswertet, ob ein Benutzer angemeldet ist, kann es leicht dazu dienen, dass ein Download nur nach einer vorherigen Benutzeranmeldung möglich ist.