Page 1 sur 1

[résolu] Gestionnaire de téléchargement d'extensions en P

Publié : 11 mars 2006, 12:14
par Kazé
Bonjour,

je cherche un gestionnaire de téléchargements en PHP pour mon site d'extensions Nvu. Je voudrais :
  • qu'il fasse un comptage des téléchargements (lapalissade)
  • qu'il permette aux utilisateurs d'IE de télécharger les fichiers *.xpi sans qu'IE ne les renomme en *.zip
Je n'ai pas besoin de fonctionnalités avancées, ni même de verrouiller l'accès aux fichiers en téléchargement, c'est juste pour compter efficacement les utilisateurs et leur faciliter le téléchargement des extensions (un peu marre d'avoir à expliquer le coup des *.zip aux utilisateurs d'IE)...

Je n'ai pas trouvé grand-chose sur ce forum à ce sujet (hormis ce sujet et celui-là qui sont restés sans réponse).

Après être allé télécharger LocaleSwitcher sur le site de Pascal, j'ai trouvé son système de téléchargement très bien... je voudrais bien avoir quelque chose de similaire.

Merci d'avance :)

Re: Gestionnaire de téléchargement d'extensions en PHP

Publié : 11 mars 2006, 13:22
par calimo
Kaze a écrit :Après être allé télécharger LocaleSwitcher sur le site de Pascal, j'ai trouvé son système de téléchargement très bien... je voudrais bien avoir quelque chose de similaire.
Ce n'est pas simplement une page fait avec Nvu ?
Tu y greffes un compteur du type phpMyVisites ou BBClone, et le tour est joué non ?

Pour IE et le renommage en .zip, alors là... :lol:

Publié : 11 mars 2006, 14:22
par martin
Si tu n'as pas besoin de fonctionnalités avancées, tu peux le coder toi-même.
Je te file le petit script que j'utilise.

Tous d'abord, réglons le problème des xpi. A la racine de ton site, tu places un fichier texte nommé ".htaccess", il doit contenir la ligne :

Code : Tout sélectionner

AddType application/x-xpinstall .xpi
Dorénavant les fichiers avec l'extension ".xpi" seront servis avec le type mime correct.
Si ce fichier existe déjà, tu rajoutes la ligne de code.

Ensuite dans tes pages au lieu de pointer vers les fichiers .xpi, tu pointes vers une adresse de type "telecharger.php?id=1&action=telecharger".
id contient un entier qui identifie le fichier, action contient "telecharger" pour télécharger ou "installer" pour installer le xpi.
le fichier telecharger.php :

Code : Tout sélectionner

<?php 
$fichiers[1]='tonExtension1.xpi';
$fichiers[2]='tonExtension2.xpi';
$fichiers[3]='tonExtension3.xpi';

$stats='statsTelechargements.txt';

if (isset($_GET['id'])) { 
	$id=(int)$_GET['id'] ;
	$action=$_GET['action'];

	// inscription des stats
	$fp=fopen($stats, 'r+');
	if ($fp) {
		$donnees=fgets($fp);
	};
	$telechargements=unserialize($donnees);
	if (isset($telechargements['fichier'][$id])) {
		$telechargements['compteur'][$id]=$telechargements['compteur'][$id]+1;
	} else {
			$telechargements['fichier'][$id]=$fichiers[$id];
			$telechargements['compteur'][$id]=1;
	};
	$donnees=serialize($telechargements);
	fseek($fp,0);
	fputs($fp, $donnees);
	fclose($fp);
	
	// telechargement du fichier
	if ($action == 'telecharger') {
		$path_fichier = pathinfo($fichiers[$id]);
		$nom_fichier = $path_fichier['basename'];
		$ext_fichier = $path_fichier['extension'];
		switch( $ext_fichier ){
		   case 'xpi': $content_type='application/x-xpinstall';       break;
		   case 'zip': $content_type='application/zip';               break;
		   //case 'pdf': $content_type='application/pdf';               break;
		   //case 'exe': $content_type='application/octet-stream';      break;
		   //case 'gif': $content_type='image/gif';                     break;
		   //case 'png': $content_type='image/png';                     break;
		   //case 'jpg': $content_type='image/jpg';                     break;
 		  default:    $content_type='application/force-download';
		};
		header('Content-Type: '.$content_type.' name='.$nom_fichier);
		header('Content-Disposition: attachment; filename='.$nom_fichier);
		header('Content-Length: '.filesize($fichiers[$id]));
		header('Content-Disposition: attachment; filename='.$nom_fichier);
		header('Cache-Control: no-cache, must-revalidate');         // HTTP/1.1
  	header('Pragma: no-cache'); 								// HTTP/1.0
		readfile($fichiers[$id]);
		exit();
	};
	if ($action == 'installer') {
		header('Location: http://joliclic.free.fr/mozilla/boox/'.$fichiers[$id]);
		exit();
	};
	
// si les donnees fournies en get ne sont pas bonnes,
// on renvoie sur une page 404
} else {
	header('Location: http:/tonsite.fr/404.html');
	exit();
};

?>
Adapte le script (et les chemins), fichiers[] contient les différents fichiers que tu proposes en téléchargement. Le fichier "statsTelechargements.txt" (que tu dois créer la première fois, vide) contiendra les données comptabilisées des téléchargements. Ces données sont sérialisées, pour les lire, il faut un autre script, par exemple "lectureStats.php" :

Code : Tout sélectionner

<?php
$archive='statsTelechargements.txt';

$fp=fopen($archive, 'r+');
	if ($fp) {
		$donnees=fgets($fp);
	};
$telechargements=unserialize($donnees);
echo '<pre>';
print_r($telechargements);
echo '</pre>';
?>
A toi de l'améliorer si tu veux une jolie page.

Evidement ce script simple n'est valable que pour quelques extensions, beaucoup trop simple et pas maintenable sinon.

(y'a peut être quelques erreurs, j'ai recopié vite fait...)

Publié : 11 mars 2006, 14:43
par Do-IT
Pour le téléchargement forcer j'utilise un script de ce genre (fait maison). Mais c'est sur il y a 36 moyens d'y arriver.

Code : Tout sélectionner

<?php
// url du fichier a telecharger : dlxpi.php?id=fichiersansextension

// nettoyage des données
$id= isset($_GET['id'])? trim (strip_tags (stripslashes( $_GET['id']))):NULL;
$id.='.xpi'; //ajout de l'extension
$fichier='/home/blabla/extention/'.$id';
if (file_exists($fichier)) {
	header("Content-Type: application/octet-stream");
	header("Content-Disposition: attachment; filename=".$id);
	readfile($fichier);
	}

?>
Je l'utilise pour tous types de fichier, jamais eu de soucis meme si le content type est generique. Pour les stats c'est plus compliqué. Comme dit Martin ca depend de la quantité de fichiers dont tu veux les stats car au bout d'un moment ca devient illisible. Ca peut se faire en mysql ou en file. En mysql c'est plus fiable je pense. Bien sur il faut mettre le fichier download.php dans le fichier robots.txt

Code : Tout sélectionner

User-agent: *
Disallow: /chemin/download.php

Publié : 11 mars 2006, 18:07
par Kazé
Merci pour vos scripts de téléchargement, je vais pomper tout ça.
Je me demande quand même si les

Code : Tout sélectionner

readfile($fichier); 
ne vont pas mettre mon modeste hébergement Free à genoux ? Je ne suis pas expert en PHP, mais un readfile occupe le serveur pendant tout le transfert du fichier, non ? Les transferts sont déjà bien lents le soir...

Bon, faudrait peut-être que j'envisage de dépenser quelques roros pour un vrai hébergement. Faut encore que je trouve un nom de domaine !
calimo a écrit :
Kaze a écrit :Après être allé télécharger LocaleSwitcher sur le site de Pascal, j'ai trouvé son système de téléchargement très bien... je voudrais bien avoir quelque chose de similaire.
Ce n'est pas simplement une page fait avec Nvu ?
Je m'ai gourré. :oops:
C'était pas "LocaleSwitcher sur le site de Pascal" qu'il fallait lire, mais "StyleSheetChooserPlus sur le site d'Olab". Demain j'arrête de boire.
calimo a écrit :Tu y greffes un compteur du type phpMyVisites ou BBClone, et le tour est joué non ?
Je ne sais pas si ça permet de compter les téléchargements, j'irai regarder ça.

PS: en fait je ne vois pas par quelle magie ça permettrait de compter les téléchargements ; si la page où figure le lien de téléchargement est sur Geckozone.org, Mozilla.ru ou autre, comment le compteur serait-il mis à jour ?
martin a écrit :Tous d'abord, réglons le problème des xpi. A la racine de ton site, tu places un fichier texte nommé ".htaccess", il doit contenir la ligne :

Code : Tout sélectionner

AddType application/x-xpinstall .xpi
Dorénavant les fichiers avec l'extension ".xpi" seront servis avec le type mime correct.
Si ce fichier existe déjà, tu rajoutes la ligne de code.
Ahhhh merci ça va aller mieux d'un coup ! ;)

Publié : 11 mars 2006, 18:25
par calimo
Kaze a écrit :Merci pour vos scripts de téléchargement, je vais pomper tout ça.
Je me demande quand même si les

Code : Tout sélectionner

readfile($fichier); 
ne vont pas mettre mon modeste hébergement Free à genoux ?
Oh, un serveur de Free, tu ne va quand-même pas commencer à t'inquiéter pour ça non ? :lol:
D'ailleurs c'est certainement ce que fait Olab.
Kaze a écrit :Je m'ai gourré. :oops:
C'était pas "LocaleSwitcher sur le site de Pascal" qu'il fallait lire, mais "StyleSheetChooserPlus sur le site d'Olab". Demain j'arrête de boire.
Ah ok dans ce cas je comprend :lol:

Un truc à faire gaffe c'est le nom du fichier lorsqu'il est enregistré. Des fois on enregistre un fichier .php et c'est c*** :lol:

Publié : 11 mars 2006, 21:54
par martin
Kaze a écrit : Je me demande quand même si les

Code : Tout sélectionner

readfile($fichier); 
ne vont pas mettre mon modeste hébergement Free à genoux ? Je ne suis pas expert en PHP, mais un readfile occupe le serveur pendant tout le transfert du fichier, non ? Les transferts sont déjà bien lents le soir...
Ben non, la plupart des scripts php (de toute sorte) font des include() et ils fonctionnent sur free, un readfile() est similaire mais sans parser quoi que ce soit, c'est trés léger, en quelque sorte il ne fait que servir octet par octet le fichier, pas d'inquiétude sur ce point...

Publié : 12 mars 2006, 16:48
par Kazé
Alors c'est vendu. ;)
Merci à tous les trois pour vos conseils avisés, je reviendrai !