CrazyCat Programming Factory
rendre internet plus accessible
 

Mettre des quotas de téléchargement

Logo phpPour fonctionner, ce script a besoin de 2 tables SQL, l'une pour gérer les fichiers et l'autre pour les quotas.

La table files contient 2 champs qui nous intéressent:
- id qui est l'identifiant unique du fichier
- url qui est l'url (relative ou absolue) du fichier

La table downloads contient les statistiques de téléchargement:
CREATE TABLE downloads (
  id int(8) NOT NULL AUTO_INCREMENT,
  ip varchar(25) NOT NULL DEFAULT '',
  ref varchar(50) NOT NULL DEFAULT '',
  datedownload timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  taille int(8) NOT NULL DEFAULT '0',
  useragent varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (id)
) ENGINE=MyISAM;


Le script
<?
// variables initiales
$maxdown=30; // Nombre de téléchargements autorisés par jour et par IP
$volmaxperday=8000*1024*1024; // Volume maximal par jour (8Mo)
$id = $_GET["id"]; // id du fichier
$ip=getenv("REMOTE_ADDR"); // IP du visiteur
$ua=$_SERVER["HTTP_USER_AGENT"]; // Juste pour des stats (peut être utilisé pour bloquer les robots)

// Evite que les accélérateur de downloads démarrent 5 téléchargements d'un coup...
srand ((double) microtime() * 1000000);
$randnum = rand(1,3);
sleep($randnum);

// Suppression des stats de plus d'un jour
$resquota=mysql_query("DELETE FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 1 DAY) < now()");

// Récupération de l'url du fichier
$res = mysql_query("SELECT url FROM files WHERE id=$id");
if (!(list($url) = mysql_fetch_row($res))) {exit;}

// Récupération de la taille du fichier
$size=filesize($url);

// Test sur le quota journalier de l'IP
$resquota = mysql_query("SELECT COUNT(*) AS compte FROM downloads WHERE ((DATE_ADD(datedownload, INTERVAL 1 DAY ) > now()) AND (ip='$ip'))");
list($ipcount)=mysql_fetch_row($resquota);
if ($ipcount>=$maxdown) die("Quota de l'IP dépassé");

// Test sur le quota journalier
$resquota=mysql_query("SELECT SUM(taille) AS taille FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 1 DAY ) > now()");
list($taille) = mysql_fetch_row($resquota);
if ($taille>$volmaxperday) die("Quota journalier dépassé");

// Test sur le quota par 15'
$resquota=mysql_query("SELECT SUM(taille) AS taille FROM downloads WHERE DATE_ADD(datedownload, INTERVAL 15 MINUTE) > now()");
list($taille) = mysql_fetch_row($resquota);
if ($taille>($volmaxperday/24/4)) die("Quota du 1/4h dépassé");

$sql_quota = "INSERT INTO downloads (ip,ref,datedownload,taille,useragent) VALUES ('$ip',$id,now(),$size,'$ua')";
$res_quota = mysql_query($sql_quota);
$filename = basename($url);
sendfile($url,$filename,$size);
?>


La fonctionn sendfile() est détaillée sur la page Forcer le téléchargement d'un fichier

©2006-2017 Geek Zone | eggdrop.fr | zeolia.net