2009-10-27 3 views
1

Comment puis-je afficher un compteur qui compte le nombre de fois qu'un fichier est téléchargé? Je l'ai déjà vu. "Téléchargé 450 fois". Merci.PHP - Nombre de fois téléchargé

+1

Pls nous savoir ce que vous avez essayé jusqu'à présent. – KB22

Répondre

6

Ne laissez pas l'utilisateur de télécharger un fichier directement, mais cuvette d'un script comme suit ...

<?php 

    $file = $_REQUEST['file']; 
    $dldir = "downloads/"; 

    if (
     (file_exists($dldir.$file) &&    // file exists 
     (strpos($file, "../") === false) && // prevent an attacker from switching to a parent directory 
    ) { 

     header('Content-type: '.mime_content_type($dldir.file)); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-Length: " . filesize($dldir.$file) ."; "); 
     header('Content-Disposition: attachment; filename="'.$file.'"'); 

     echo file_get_contents($dldir.$file); 

     /** Update the counter here, e.g. by using mysql **/ 
    } else { 
     die("File not found"); 
    } 

?> 
+4

Veillez également à ne pas autoriser le téléchargement de fichiers tels que/etc/passwd lors de la création de scripts de téléchargement personnalisés. – Kaivosukeltaja

+0

Je voudrais spécifier quel dossier pour obtenir un fichier, ne laissez pas (comme Kaivos .. dit) utilisateurs détourner un fichier de vous comme/etc/passwd – Jakub

+0

Droit ... J'ai ajouté du code pour empêcher cela. – ty812

1

There vous allez. En outre, si vous préférez utiliser MySQL pour la persistance, il existe une solution this.

2

Si vous voulez le faire avec PHP, vous devez contrôler le téléchargement dans un script PHP. Fondamentalement, il se résume à deux lignes de pseudo-code suivant:

set_number_of_downloads(get_number_of_downloads() + 1); 
readfile($file_being_downloaded); 
0

sur Apache vous pourriez avoir mod_rewrite mettre à jour une base de données lorsque le fichier est demandé. Cela a l'avantage de la rapidité d'envoi (sendfile peut être utilisé), et vous n'avez pas besoin de changer vos URL ou structure de répertoire.

#!/usr/bin/perl 
$| = 1; 
$dbh = DBI->connect("dbi:mysql:database=; host=localhost; user=; password=") 
or die "Connecting from PHP to MySQL database failed: $DBI::errstr"; 
while (<STDIN>) { 
    $dbh->query(... update database ...); 
    print $_; 
} 

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteengine

Questions connexes