89 votes

Comment suivre les téléchargements de fichiers

J'ai un site web qui lit des mp3 dans un lecteur flash. Si un utilisateur clique sur "play", le lecteur flash télécharge automatiquement un mp3 et commence à le lire.

Existe-t-il un moyen simple de savoir combien de fois un clip musical (ou tout autre fichier binaire) a été téléchargé ?


Le lien de lecture est-il un lien vers le fichier fichier mp3 ou vers un code javascript qui fait apparaître un lecteur ?

Dans ce dernier cas, vous pouvez facilement ajouter votre propre code de journalisation pour suivre le nombre de visites.

Dans le premier cas, vous aurez besoin de quelque chose qui peut suivre le journal du serveur web et faire cette distinction. Mon plan d'hébergement plan d'hébergement est livré avec Webalizer, qui fait cela très bien.

C'est un code javascript donc ça répond à la question.

Cependant, il serait bon de savoir comment suivre les téléchargements en utilisant l'autre méthode (sans changer d'hôte).

43voto

w-ll Points 1515

Le plus drôle, c'est que j'ai écrit une galerie de médias php pour toutes mes musiques il y a 2 jours. J'ai eu un problème similaire. J'utilise http://musicplayer.sourceforge.net/ pour le lecteur. Et la liste de lecture est construite via php. Toutes les requêtes musicales vont vers un script appelé xfer.php?file=Quoi ?

$filename = base64_url_decode($_REQUEST['file']);
header("Cache-Control: public");
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, '-_,', '+/='));
}

Et quand vous appelez les fichiers, utilisez quelque chose comme :

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

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

Si vous utilisez du JavaScript ou un lecteur flash (JW player par exemple) qui nécessite le lien réel d'un fichier mp3 ou autre, vous pouvez ajouter le texte "&type=.mp3" de sorte que le lien final devienne quelque chose du genre : "www.example.com/xfer.php?file=34842ffjfjxfh&type=.mp3". De cette façon, on a l'impression qu'il se termine par une extension mp3 sans que le lien du fichier soit affecté.

20 votes

Il y a une vulnérabilité de traversée de répertoire dans ce script ! Un attaquant peut passer dans xfer.php?file=../../../passwd ou tout ce qu'il veut ! Soyez prudent ! !!

7 votes

Cela fera exploser les limites de mémoire du serveur si les fichiers sont trop gros et que votre trafic est élevé j'en ai fait l'expérience moi-même.

1 votes

Comment corriger la "vulnérabilité par traversée de répertoire" ?

30voto

Tim Boland Points 4063

Utilisez les fichiers journaux de votre httpd. Installer http://awstats.sourceforge.net/

26voto

randy melder Points 1614

Utilisez bash :

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

0 votes

Cette méthode présente au moins 2 défauts : elle compte les requêtes GET et HEAD et compte tous les codes de réponse HTTP. Par exemple, il peut y avoir beaucoup de réponses 206, ce qui vous conduira à surestimer les téléchargements.

14voto

Vinay Y S Points 182

Si votre chanson / fichier binaire a été servi par apache, vous pouvez facilement grep le access_log pour connaître le nombre de téléchargements. Un simple postlogrotate script peut grep les logs et maintenir vos statistiques de comptage dans un db. Ceci a l'avantage de la performance en n'étant pas dans le chemin de code de votre requête en direct. Faire des choses non critiques comme les statistiques hors ligne est une bonne idée pour faire évoluer votre site web vers un grand nombre d'utilisateurs.

13voto

saint_groceon Points 2696

Vous pourriez même configurer une directive Apache .htaccess qui convertit les requêtes *.mp3 en la chaîne de requête avec laquelle dubayou travaille. Cela pourrait être un moyen élégant de conserver la demande directe et de pouvoir intégrer la fonction de journalisation dans la réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X