| UPDATE: PHP Download-counter Script |
|
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.
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
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änkungBis 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. |

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /mnt/web6/60/23/51093523/htdocs/doc/download.php on line 29
Er bricht auch direkt an dieser Stelle im Code den Seitenaufbau ab...
hab eine php-Seite "wasgibts.php" von wo aus man eine ZIP-Datei "test.zip" runterladen soll: Ordnerstruktur:
doc/wasgibts.php
doc/download.php
doc/zip/test.zip
habe auch die download.php geändert:
Line 28 /** Downloadordner */
Line 29 public $folder = '.zip/';
application/pdf ist ja genau das, was du nicht haben willst. Dadurch weiß der Browser, dass es ein PDF ist und versucht den Acrobat-Reader im Fenster zu starten. Versuchs mal mit application/octet-stream und schau mal hier. http://www.feenders.de/ratgeber/experten/398-download-von-dateien-erzwingen.html
Mal was Anderes. Momentan nutze ich ja Zip-Dateien.
In diesen befindet sich eigentlich nur eine Gleichnamige PDF-Datei. Da es bei der Größe von rund 500kb kaum einen relevanten Unterschied macht, würde ich die Daten eigentlich gerne gleich als PDF zum Download zur Verfügung stellen. Diese sollen aber auch tatsächlich runtergeladen werden und nicht im neuen Fenster geöffnet werden (um den Traffic zu minimieren).
Bei meinem Schnelltest (application/pdf´) entstand jedoch nur ein leerer Bildschirm.
Vielleicht kann mir dabei noch jemand behilflichs ein.
Vielen Dank auf jeden Fall für die Hilfe.
Gruß ChriZ
danke für Deinen Code - ich kann den Sinn der Erweiterung (von Eisbär) aber nicht erkennen.
1: Der Downloadcounter ist Teil des Dateinamens. Ihn auszugeben ist kein Problem. Wofür also count.txt?
2: Sobald mehrere Dateien über das script downgeloadet würden, dann würden die Counter kollidieren weil alle auf die gleiche Datei zugreifen.
Ich werde das Script erweitern und eine Funktion zur Bidschirmausgabe des Downloadcounters einbauen.
mfg... Dirk
hmmm - die Fehlermeldung gibt doch den Hinweis - Permission denied - überprüfe die Rechte in dem Ordner ...
Ciao Joest
Nun wollte ich das Script hier ausprobieren und hab folgendes gemacht:
"download.php" erstellt, alles entfernt und nur den Scriptcode eingefügt. Neuen Unterordner "test" gewählt. Seite phptest.html (gleicher Ordner, wie "download.php") erstellt. Link "download.php?f=test.zip" erstellt.
"test.zip" im gewählten Unterordner"test" eigefügt.
Soweit müsste es nun ja meiner Theorie nach funktionieren ^^
Er findet die Datei zweifellos ja auch, scheint aber keine gibt mir aber nur diese Fehlermeldung:
Warning: rename(./test/test.zip,./test/0:0:test.zip) [function.rename]: Permission denied in /var/www/vhosts/meine-domain.de/httpdocs/test/download.php on line 15
weitere Fehlermeldungen dann natürlich in Zeile 25,33,34,35,36,36.
Vielleicht weiß ja einer was ich falsch gemacht habe :D
Ich schaffe es leider nicht die Ergänzugen, insbesondere die Funktion mit dem Schreiben und der Ausgabe der counts, im oben aufgezeigten script selbst einzubauen.
Wäre dankbar, wenn jemand das hier veröffentlichen würde :)
Danke!
if(!file_exists("count.txt")){
$counter=fopen("count.txt", "a");
}
else{
$counter=fopen("count.txt", "r+");
}
$aufruf=fgets($counter,100);
rewind($counter);
fclose($counter);
echo $aufruf;
diesen teil einfach ersetzten ;)
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);
// Counter count.txt
if(!file_exists("count.txt")){
$counter=fopen("count.txt", "a");
}
else{
$counter=fopen("count.txt", "r+");
}
$aufruf=fgets($counter,100);
$aufruf=$aufruf+1;
rewind($counter);
fputs($counter,$aufruf);
fclose($counter);
break;
}
ausgabe mit :
Sure it does! "f" ist just the name of the GET variable sent by the script. If your scriptname is "download.php"... ... and your filename is "test.zip" ... you call http://www.yourhost.com/download.php?f=test.zip The file test.zip must exist in a folder called "./downloads/" and it must be writable by the php script. If you want files with other extensions you must enhance the script. Anyway: this is just an example for programmers.
folder name how to call the script ...
Hi ef,
danke für Feedback. Wir nutzen ähnliche Scripts aber auch z.B. für Downloadlinks per Email (z.B. in Shopanwendung für automatisierte Emails nach Bezahlung mit Downloadlink auf Software / eBooks etc.) - das würde mit Deiner Modifikation so nicht funktionieren ...
Ciao Joest
$path="downloads/files/";
$host = 'www.dein-host.de';
$ref = parse_url($_SERVER["HTTP_REFERER"]);
if(strtolower($ref['host']) != strtolower($host)) {
// Weiterleiten, zb zu Hilfeseite
header('Location: /');
exit;
}
ich bin absoluter php neuling...
ich brauche für eine website einen downloadcounter und bin dann auf das script gestoßen.
bewirken will ich damit, dass sich der dateiname ändert +1 pro download und man das ergebnis quasi über ein backend aufrufen kann.
z.b. gebe ich hinter der domain "/pdf/ger" ein und sehe dann das verzeichnis und anhand der namen, wie oft die pdf's runtergeladen wurden.
jetzt meine frage: wie binde ich das denn jetzt in meine seite ein?
http://217.19.185.23/test2/solpower_html/page.html
naja - so wie im Script angegeben schon. Aber mit minimaler Modifikation: -> header('Content-type: application/zip') - ziemlich am Ende des Scriptes - ist das ja leicht entsprechend Deinen Wünschen anzupassen ;-)
Ciao Joest
eins jedoch...
Das Beispiel funktioniert nur mit zip Archiven