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

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
Kazé
Varan
Messages : 1743
Inscription : 10 févr. 2005, 10:26

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

Message 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 :)
Dernière modification par Kazé le 12 mars 2006, 16:49, modifié 1 fois.
KompoZer lead dev
Ubuntu 10.04 Lucid Lynx — « L'erreur est humaine, mais vraiment foutre la merde nécessite le mot de passe root. »
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

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

Message 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:
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message 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...)
Do-IT
Iguane
Messages : 537
Inscription : 03 juil. 2005, 09:46

Message 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
Redhat, CentOs, Mandriva, Ubuntu au boulot. Ubuntu à la maison. Vista et Xp grâce à la vente liée.
Soutenir KompoZer
Kazé
Varan
Messages : 1743
Inscription : 10 févr. 2005, 10:26

Message 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 ! ;)
KompoZer lead dev
Ubuntu 10.04 Lucid Lynx — « L'erreur est humaine, mais vraiment foutre la merde nécessite le mot de passe root. »
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message 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:
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message 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...
Kazé
Varan
Messages : 1743
Inscription : 10 févr. 2005, 10:26

Message par Kazé »

Alors c'est vendu. ;)
Merci à tous les trois pour vos conseils avisés, je reviendrai !
KompoZer lead dev
Ubuntu 10.04 Lucid Lynx — « L'erreur est humaine, mais vraiment foutre la merde nécessite le mot de passe root. »
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité