2008-08-01 22 views
65

Ich habe eine Website, die MP3s in einem Flash-Player spielt. Wenn ein Benutzer auf "Abspielen" klickt, lädt der Flash Player automatisch ein MP3 herunter und beginnt mit der Wiedergabe.Wie kann ich Dateien herunterladen

Gibt es eine einfache Möglichkeit zu verfolgen, wie oft ein bestimmter Songclip (oder eine beliebige Binärdatei) heruntergeladen wurde?


ist das Spiel Link ein Link auf die aktuelle mp3-Datei oder einige JavaScript-Code , dass ein Spieler erscheint?

Wenn letzteres, können Sie einfach Ihren eigenen Logging-Code dort fügen Sie die Anzahl der Treffer, um es zu verfolgen.

Wenn die ehemalige, benötigen Sie etwas , die das Web-Server-Protokoll selbst verfolgen und diese Unterscheidung machen können. Meine Hosting-Plan kommt mit Webalizer, , die dies schön macht.

Es ist Javascript-Code, so dass das beantwortet.

Allerdings wäre es schön zu wissen, wie man Downloads mit der anderen Methode verfolgt (ohne Hosts zu wechseln).

Antwort

39

Das Lustige ist, dass ich vor 2 Tagen eine PHP-Mediengalerie für meine ganze Musik geschrieben habe. Ich hatte ein ähnliches Problem. Ich verwende http://musicplayer.sourceforge.net/ für den Player. Und die Playlist wird über PHP erstellt. Alle Anforderung Musik gehen dort ein Skript namens xfer.php file = UNABHÄNGIG

$filename = base64_url_decode($_REQUEST['file']); 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header('Content-disposition: attachment; filename='.basename($filename)); 
header("Content-Transfer-Encoding: binary"); 
header('Content-Length: '. filesize($filename)); 

// Put either file counting code here. either a db or static files 

// 

readfile($filename); //and spit the user the file 


function base64_url_decode($input) { 
    return base64_decode(strtr($input, '-_,', '+/=')); 
} 

Und wenn Sie Dateien verwenden, rufen so etwas wie:?

function base64_url_encode($input) { 
    return strtr(base64_encode($input), '+/=', '-_,'); 
} 

http://us.php.net/manual/en/function.base64-encode.php

Wenn Sie einige sind mit JavaScript oder ein Flash-Player (zB JW-Player), der den tatsächlichen Link als mp3-Datei oder ähnliches benötigt, können Sie den Text "& type = .mp3" anhängen, so dass der letzte Link etwa wie folgt aussieht: "www.example.com/ xfer.php? Datei = 34842 ffjfjxfh & Typ = .mp3 ". So sieht es aus, als ob es mit einer MP3-Erweiterung endet, ohne die Dateiverknüpfung zu beeinflussen.

+17

Es gibt eine Directory Traversal Schwachstelle in diesem Skript! Ein Angreifer kann die Datei "xfer.php? File = ../../../passwd" oder was auch immer sie wollen weitergeben! Achtung!!! –

+4

Dies wird die Speichergrenzen des Servers sprengen, wenn die Dateien zu groß sind und der Verkehr hoch ist. Etwas, das ich selbst erlebt habe. – tmsimont

+0

Wie behebt man die "Directory Traversal Vulnerability"? – anarchOi

6

Ist der Play-Link ein Link zur eigentlichen MP3-Datei oder zu einem JavaScript-Code, der einen Player öffnet?

Wenn Letzteres, können Sie leicht Ihren eigenen Logging-Code hinzufügen, um die Anzahl der Treffer zu verfolgen.

Wenn der ehemalige, müssen Sie etwas, das Web-Server-Protokoll selbst verfolgen können und machen diese Unterscheidung. Mein Hosting-Plan kommt mit Webalizer, was das gut macht.

10

Sie könnten sogar eine Apache .htaccess -Direktive einrichten, die * .mp3-Anfragen in die Querystring konvertiert, mit der dubayou arbeitet. Es könnte ein eleganter Weg sein, die direkte Anfrage aufrecht zu erhalten und trotzdem in der Lage zu sein, die Log-Funktion in die Antwort einzubetten.

2

Gibt es eine Datenbank für Ihre Musikbibliothek?Wenn es einen Server-Code gibt, der beim Herunterladen der MP3-Datei ausgeführt wird, können Sie dort zusätzlichen Code hinzufügen, um die Anzahl der Spiele zu erhöhen. Sie könnten auch Javascript eine zweite Anfrage machen, um die Anzahl der Spiele zu erhöhen, aber dies könnte dazu führen, dass Personen/Roboter fälschlicherweise Zählungen erhöhen.

Ich arbeitete für eine Internetradio-Site und wir verwendeten separate Tabellen, um die Zeit zu verfolgen, die jedes Lied gespielt wurde. Unsere Streams wurden von einem Perl-Skript mit Icecast unterstützt, sodass wir jedes Mal, wenn ein neuer Track abgespielt wurde, eine Datenbankanfrage ausgelöst haben. Um dann die Anzahl der Spiele zu berechnen, würden wir eine Abfrage ausführen, um zu zählen, wie oft die ID eines Liedes im Abspielprotokoll war.

11

Wenn Ihre Song-/Binärdatei von Apache geliefert wurde, können Sie die Datei access_log ganz einfach durchsuchen, um die Anzahl der Downloads zu ermitteln. Ein einfaches Post-Logrotate-Skript kann die Protokolle grep und Ihre Zählstatistik in einer Datenbank verwalten. Dies hat den Leistungsvorteil, da Sie nicht in Ihrem Live-Anforderungscodepfad enthalten sind. Unkritische Dinge wie Statistiken offline zu tun ist eine gute Idee, um Ihre Website für eine große Anzahl von Benutzern zu skalieren.

20

Verwenden bash:

grep mp3 /var/log/httpd/access_log | wc 
2

Das Problem, das ich mit Dingen wie AWStats hatte/das Lesen durch Webserver-Logs ist, dass große Downloads können oft innerhalb der Protokolle in Datenblöcke aufgeteilt werden. Dies macht es sehr schwierig, die genaue Anzahl der Downloads zu vereinbaren.

Ich würde vorschlagen, Google Analytics Event Tracking, da dies einmal pro Klick auf einen Download-Link registrieren wird.

Verwandte Themen