Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PHP - FileDownload Counter implementieren ohne DB (https://www.delphipraxis.net/48503-php-filedownload-counter-implementieren-ohne-db.html)

sniper_w 26. Jun 2005 14:44


PHP - FileDownload Counter implementieren ohne DB
 
Also, mal angenommen, ich habe auf meinem Web-Server eine Datei Names MyFile.EXT. Ich biete sie zum Download. Ich will jetzt eine PHP-Skripte, die in einer Datei (counter.txt) schreibt, wieviel man meine MFile.EXT Datei heruntergeladen hat. Wie ? Und ja, bitte ohne MySQL.
Danke.

Neuni 26. Jun 2005 14:48

Re: PHP - FileDownload Counter implementieren ohne DB
 
Kannst du PHP?

sniper_w 26. Jun 2005 15:01

Re: PHP - FileDownload Counter implementieren ohne DB
 
Ja.

Duffy 26. Jun 2005 15:10

Re: PHP - FileDownload Counter implementieren ohne DB
 
Hallo sniper_w,
so dürfte es dann sein ...
Code:
<?php
  $file= fopen("counter.txt", "r+") or die ("die Datei laesst sich nicht oeffnen!");
  fscanf($file, "%d", $count);
  $count++;
  rewind($file);
  fputs($file, $count);
  fclose($file);
?>
bye
Claus

sniper_w 26. Jun 2005 15:37

Re: PHP - FileDownload Counter implementieren ohne DB
 
Danke, ich habe mich ungeschickt ausgedrückt. Ich weiss wie man eine Datei per PHP öffnet, leist, screibt usw. Was ich nicht weiss ist, wenn man auf die Link (die zum Download führt) klickt, wei sendet man diese Datei an einen Client ( nach dem man den Counter um 1 erhöht hat)?

Sergej 26. Jun 2005 15:39

Re: PHP - FileDownload Counter implementieren ohne DB
 
mach einfach ne Weiterleitung auf die Datei

Code:
<?php
print "<meta http-equiv=\"refresh\" content=\"0; URL=http://mein.host/meine.datei\">";
?>

Greetz Sergej

Mystic 26. Jun 2005 15:41

Re: PHP - FileDownload Counter implementieren ohne DB
 
Bei meiner Homepage mache ich das so:

Einen Ordner 'files' der nur eine .htaccess enthält:

Code:
RewriteEngine on
RewriteBase   /files/
RewriteRule   ^(.+)$ /download.php\?file=$1
Einen Ordner 'realfiles' der dann die Dateien enthält.

Eine download.php im Stammverzeichnis:

Code:
<?php
  $filename = 'realfiles/' . $_GET['file'];
  if (IsSet($_GET["file"]) && file_exists($filename) && strpos($filename,'../') === false)
  {
    require 'dblogin.php';
    $dbh = mysql_login();
    mysql_select_db('danny');
    $stats_query = "SELECT count FROM downloads WHERE file='" . $_GET['file'] . "'";
    $stats_result = mysql_query($stats_query);
    if (mysql_num_rows($stats_result) > 0)
    {
      $stats_array = mysql_fetch_assoc($stats_result);
      if ($stats_array['count'] !== null)
      {
        $stats_query = "UPDATE downloads SET count = count + 1 WHERE file='" . $_GET['file'] . "'";
        mysql_query($stats_query);
      }
    }
    mysql_close($dbh);
    header('Content-type: application/force-download');
    header('Content-length:' . filesize($filename));
    readfile($filename);
  } else {
    header('Status: 404 Not Found');
    chdir('errors');
    require '404.php';
  }
?>
Das Ergebnis ist ein komplett transparenter Downloadcounter. Wenn der Client die Datei /files/abc.def anfragt, wird das intern auf /download.php?file=abc.def umgeleitet. Das Skript erhöht dann den Counter für die Datei um 1 (per MySQL) und schickt die Datei /realfiles/abc.def an den Client.

Zitat:

Zitat von Sergej
mach einfach ne Weiterleitung auf die Datei

Code:
<?php
print "<meta http-equiv=\"refresh\" content=\"0; URL=http://mein.host/meine.datei\">";
?>

Greetz Sergej

Wenn es schon eine Weiterleitung sein muss dann aber per
Code:
header("Location: http://mein.host/meine.datei");
und nicht per meta-refresh.

sniper_w 26. Jun 2005 17:13

Re: PHP - FileDownload Counter implementieren ohne DB
 
Danke, ihr habt geholfen, es geht wunderbar.

Sergej 26. Jun 2005 17:42

Re: PHP - FileDownload Counter implementieren ohne DB
 
Zitat:

Zitat von Mystic

Wenn es schon eine Weiterleitung sein muss dann aber per
Code:
header("Location: http://mein.host/meine.datei");
und nicht per meta-refresh.


Was spricht gegen den Meta-Refresh :?:

Greetz Sergej

Neuni 26. Jun 2005 18:19

Re: PHP - FileDownload Counter implementieren ohne DB
 
mit header gehts schneller ;)

Mystic 26. Jun 2005 18:20

Re: PHP - FileDownload Counter implementieren ohne DB
 
Die Umleitung per Header ist eleganter als die Umleitung per meta-refresh oder per Javascript. Letztere Methoden sollten nur benutzt werden wenn man kein serverseitiges Scripting machen kann.

Die Umleitung per Header geschiet sobald der Browser den Header empfangen hat. Bei Javascript/meta wird erst die gesamte Seite geladen (und dargestellt :!: ).

Die Umleitung per Header ist nahtlos und spart Zeit.

Sergej 26. Jun 2005 18:33

Re: PHP - FileDownload Counter implementieren ohne DB
 
ah okay...danke wusst ich noch gar nicht.

[edit] hmm anderseits gibt es in diesem Fall keinen Geschwindigkeitsverlust. Es wird ja nichts geladen, und die Weiterleitung wird direkt von script 'befohlen'. Ein Nachteil hat man bei Headern nämlich auch: Es kann/darf vorher nichts im Browser ausgegeben werden, was ja doch manchmal gewünscht ist.[/edit]


Greetz Sergej

Mystic 26. Jun 2005 18:49

Re: PHP - FileDownload Counter implementieren ohne DB
 
meta-refresh tut auch den Zurück-Knopf 'zerstören', jedenfalls kommt man mit einem einzigen Klick dann nicht zu der Seite zurück, wo man den Download angefragt hat, sondern zu der Seite die das meta-refresh enthält, und wird dort wieder sofort zum Download umgeleitet.

idontwantaname 26. Jun 2005 18:59

Re: PHP - FileDownload Counter implementieren ohne DB
 
deswegen rät das W3C auch von meta-forwarding ab, hab mal einen artikel darüber gelesen, finde ihn jedoch grad nicht

[edit] gefunden: http://www.w3.org/QA/Tips/reback

Sergej 26. Jun 2005 20:08

Re: PHP - FileDownload Counter implementieren ohne DB
 
Okay überzeugt =)

Greetz Sergej


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz