Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Winhistory.de Downloads reformieren. ideen?
gandro Offline
Quälgeist

Beiträge: 8.950
Registriert seit: Jul 2008
Beitrag #21
Winhistory.de Downloads reformieren. ideen?
Sooo.. hab nun endlich Zeit gehabt, mal nen Download-Counter zu programmieren:

Kopierst du folgenden Code z.B. nach http://winhistory.de/downloads/ als Datei getfile.php, kannst du die Downloads z.B. über http://winhistory.de/downloads/getfile.php/DOS5.exe verlinken. Ich hab das absichtlich nicht über Parameter implementiert, weil da einige Browser/Downloadmanager dann einen falschen Dateinamen setzen (Ansonsten einfach das Argument von download_file() abändern).

Existiert die Datei http://winhistory.de/downloads/dateien/DOS5.exe, dann zählt er den Counter für die Datei einen hoch und leitet dann den Browser um (geht mit jedem HTTP/1.1-konformen Browser/Downloadmanager/Telnetbenutzer *narf*). Existiert die Datei nicht, zählt er nichts, leitet aber trotzdem weiter (gibt dafür dann die Standard 404 deines Webservers aus).

Die ersten drei Konstanten kannst du evtl. noch anpassen. Wenn du willst, kannst du die counter.txt auch ausserhalb des HTTP-Zugriffes ablegen (einfach Pfad ändern), damit von aussen keiner die Counter lesen kann (kaputt machen kann man damit allerdings eigentlich nichts).

PHP-Code:
<?php
/* Lokaler Pfad in dem nach Dateien gesucht wird */
define("FS_DIR""dateien/");
/* HTTP-Pfad zum obigen Ordner */
define("HTTP_DIR""http://winhistory.de/downloads/dateien/");
/* Counter-Datei für alle Dateien */
define("COUNTER_FILE""counter.txt");

function 
read_counter_file() {
    
$counter_array = array();
    if(
$fp = @fopen(COUNTER_FILE"r")) {
        
flock($fpLOCK_SH);
        while(!
feof($fp)) {
            
$buffer trim(fgets($fp256));
            if(empty(
$buffer)) continue;
            list(
$file$count) = explode('|'$buffer2);
            
$counter_array[$file] = (int) $count;
        }
        
fclose($fp);
    }
    return 
$counter_array;
}

function 
write_counter_file(array $counter_array) {
    if(
$fp = @fopen(COUNTER_FILE"w")) {
        
flock($fpLOCK_EX);
        foreach(
$counter_array as $file => $count) {
            
fwrite($fp$file.'|'.$count.PHP_EOL);
        }
        
fflush($fp);
        
fclose($fp);
        return 
true;
    }
    return 
false;
}

function 
get_counter_for($file) {
    
$counter_array read_counter_file();
    return isset(
$counter_array[$file]) ? 
        
$counter_array[$file] : 0;
}

function 
download_file($requested_file) {

    
/* die Anfrage überprüfen */
    
if(empty($requested_file) || $requested_file == "/") {
        
header("HTTP/1.1 400 Bad Request");
        exit(
"<h1>400 Bad Request</h1>");
    }

    
/* überflüssiges '/' aus dem String entfernen */
    
$requested_file substr($requested_file1);

    
/* wenn die Datei existiert, den Counter hochzählen */
    
if(file_exists(FS_DIR.$requested_file)) {
        
$counter_array read_counter_file();
        if(isset(
$counter_array[$requested_file])) {
            
$counter_array[$requested_file]++;
        } else {
            
$counter_array[$requested_file] = 1;;
        }

        
ignore_user_abort(1);
        
write_counter_file($counter_array);
        
ignore_user_abort(0);
    }

    
header("HTTP/1.1 302 Found");
    
header("Location: ".HTTP_DIR.$requested_file);
    exit();
}

/* überprüfen, ob die Datei inkludiert wurde */
list($main_file) = get_included_files();

/* wenn nicht, dann die Weiterleitung starten */
if($main_file == __FILE__) {
    
$requested_file 
        
str_replace($_SERVER['SCRIPT_NAME'], ""$_SERVER['PHP_SELF']);
    
download_file($requested_file);
}

?>
Ich hoffe, das ganze ist Race-Condition sicher. Ich arbeite zwar mit Dateisperren, aber so ganz trau ich PHP in der Hinsicht nicht. Die Zählerdatei ging bei mir bei ein paar Stress-Tests allerdings nicht in die Brüche.

Natürlich hab ich auch grad eine Programmierschnittstelle eingebaut. Wenn du die Datei nicht via Browser aufrufst, sondern via include() einbindest, kannst du auf die Funktionen zugreifen, ohne dass er weiterleiten will. Beispiel:

PHP-Code:
<?php
include("getfile.php");

/* gibt den Wert des Counter der Datei DOS5.exe zurück */
echo get_counter_for("DOS5.exe");
?>
(Dieser Beitrag wurde zuletzt bearbeitet: 20.05.2009 10:01 von gandro.)
19.05.2009 20:24
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
freaked Offline
× ∫яεαкεδ εησυġн × ζιgнтѕтαя ×

Beiträge: 17.321
Registriert seit: Jul 2008
Beitrag #22
Winhistory.de Downloads reformieren. ideen?
hach ich kann mich noch erinnern, da gabs mal wind 1.01 auf bootdisk zum saugen
das war toll b1

19.05.2009 20:27
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Dirk Offline
Software Archäologe

Beiträge: 14.934
Registriert seit: Jul 2008
Beitrag #23
Winhistory.de Downloads reformieren. ideen?
Nein, so was würde es doch nie auf winhistory.de gegeben haben. da musst du dich irren.;) hab die disketten erst letztlich im keller wiedergefunden.

Ich habe jetzt mal die Updates Seite verbastelt. Etliche Platzhalter, Farben noch nicht endgültig und die Links müssten nicht funktionieren. aber schaut mal ob das technisch geht und was noch fehlen könnte:
Downloads: Updates für Windows

Ist javascript.

@gandro: sieht interessant aus. schaue ich mir mal morgen ein und werde es in die seite einbinden.

19.05.2009 22:03
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.950
Registriert seit: Jul 2008
Beitrag #24
Winhistory.de Downloads reformieren. ideen?
Hm.. die Updateseite sieht interessant aus, auch von der Auswahl her.

Die Links sind aber kaputt, weil sie zuletzt ein Backslash "\" als Verzeichnistrenner verwenden, was via HTTP nicht geht.
19.05.2009 22:22
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Randy Offline
verheiratet seit 06.12.06

Beiträge: 3.550
Registriert seit: Jul 2008
Beitrag #25
Winhistory.de Downloads reformieren. ideen?
Das mit dem Filter ist gut gelöst. :)

19.05.2009 22:25
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Dirk Offline
Software Archäologe

Beiträge: 14.934
Registriert seit: Jul 2008
Beitrag #26
Winhistory.de Downloads reformieren. ideen?
@gandro:
Hab deinen beitrag mal wiederhergestellt. das war jetzt wirklich nen bug. aber ich will ja eh die links in deine variante umbauen.

19.05.2009 22:36
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
CHRiSNEW Offline
Internetblasensammler

Beiträge: 2.860
Registriert seit: Jul 2008
Beitrag #27
Winhistory.de Downloads reformieren. ideen?
Das Skript ist gut. Wobei ich persönlich lieber etwas mit MySQL bevorzugen würde. Dennoch die Datei variante ist hier völlig ausreichend.

19.05.2009 22:55
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.950
Registriert seit: Jul 2008
Beitrag #28
Winhistory.de Downloads reformieren. ideen?
Achso, okay.

Hab mir vorhin noch den JavaScript-Code angeschaut... naja... derart viel HTML in Javascript-Strings verpackt, brrr... da läufts mir kalt den Rücken runter.

Du kannst via DOM ja HTML-Code generieren oder den bestehenden verändern, da brauchst du den nicht in Strings abpacken. Wobei das auch nur nen haufen Arbeit gibt.

Ich persönlich würde den Code in einzelne DIVs mit ner id="blubb" verpacken und diese dann via JavaScript (und CSS aka "element.style.display = 'none';") ein- und ausblenden. Dann kannst du das sogar so machen, dass Leute ohne Javascript (FFX NoScript oder Leute mit Uraltbrowsern, was grad bei den Updates durchaus ein Szenario ist) trotzdem den Inhalt sehen.

Wobei es auch nicht optimal ist. Am tollsten hier wäre natürlich AJAX, aber das macht nur mit nem Backend Sinn, was du ja nicht hast.
19.05.2009 22:55
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Dirk Offline
Software Archäologe

Beiträge: 14.934
Registriert seit: Jul 2008
Beitrag #29
Winhistory.de Downloads reformieren. ideen?
Hatte mir das mit DOM angeschaut, und fand es irgendwie unhandlich. Das das so sehr nach hack aussieht stört mich mal nicht.

die andere idee finde ich dagegen reizvoller. wobei man heute ohne javascript glaub ich nichts mehr machen kann. Da funkt auch kein Ajax mehr. was ich btw schrecklich finde. zieht gerade alte computer tierisch runter. Polling to death...

20.05.2009 08:39
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
TAL Offline
機関車

Beiträge: 6.359
Registriert seit: Jul 2008
Beitrag #30
Winhistory.de Downloads reformieren. ideen?
Mir würden da noch Bilder fehlen auf der linken Seite, das ganze schaut etwas "nackt" aus.

20.05.2009 08:47
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste