Téléchargement fichiers avec ticket de téléchargement

Soyez le premier à donner votre avis sur cette source.

Vue 18 201 fois - Téléchargée 1 310 fois

Description

Bonjour tout le monde.
Alors voila. Cette source fait suite à une conversation que j'ai eut sur ce site à propos de la manière de forcer le téléchargement d'un fichier (plustôt qu'il ne s'ouvre dans le navigateur).

Le problème présenté était que si l'on fait un appel à un fichier du type:
start_download?file_name=blabla.doc

et bien un petit malin pouvait alors télécharger n'importe quel fichier sur le serveur, y compris du script php... pas cool...

Les solutions proposées étaient de limiter les accès à des répertoires de téléchargements protégés ou à restreintre les extensions téléchargeables et, je doit dire, celà ne me satisfesait pas beaucoup.

J'ai donc mis au point une petite classe de téléchargement par ticket. Ainsi les noms de fichiers sont cachés dernière une suite numérique et il n'est pas possible de télécharger autre chose que ce qui est proposé au téléchargement.

J'ai essayé du mieux que j'ai pu de faire quelque chose de portable. Maintenant, nul n'est parfait.

Voici donc le fonctionnement:

il faut, pour chaque fichier à télécharger, attribuer un numéro d'autorisation de téléchargement.
il faut ensuite stocker le numéro de téléchargement dans la base de données ainsi que le nom du fichier en question.

quand la page est affichée, les liens vers les documents sont renseignée avec le numéro de téléchargement.

quand l'utilisateur clique sur un lien, il faut récupérer le numéro de téléchargement.
puis rechercher dans las base de données à quel fichier il correspond.
ensuite construire la page pour forcer le téléchargement à partir du résultat précédent.

prévoir un processus de nettoyage de la table des téléchargements (lien de plus de 60mn)

L'utilisation de la classe se borne à 2 fonctions:
set_download() -> mise en place d'un lien de téléchargement
start_download() -> lancement d'un téléchargement

/////////////////////////////////////////////////
- mise à disposition d'un téléchargement:

objet->file_name = 'blabla.doc'; // le nom du fichier sur le disque du serveur
objet->file_title = 'blabla blabla blabla blabla'; // le titre du fichier
objet->title_chunk_size = 4; // le nombre de caractères pour la césure de ligne
objet->title_chunk_nb_row = 3; // le nombre de ligne à afficher pour le titre
objet->icon = 'images/icon.gif'; // icone représentant un téléchargement
objet->icon_on_mouse_over = 'images/icon_on_mouse_over.gif'; // icon représentant un téléchargement pour le passage de la souris
objet->icon_on_mouse_out = 'images/icon_on_mouse_out.gif'; // icon représentant un téléchargement après le passage de la souris
objet->start_download_file_name = 'start_download.php?download_ticket='; // le nom du fichier et le paramètre d'appel lors du clic sur le lien
objet->set_download(); ^
echo objet->html_code; ^|^
|
- Le code HTML généré par la fonction utilise deux classes CSS: |
div ElementAsuivre qui contient toute la balise du téléchargement |
span ElementLegende qui concerne le titre césuré qui s'affiche sous l'icone de téléchargement |
//////////////////////////////////////////////////// |
- demmarage du téléchargement (start_download.php dans l'exemple présent): |
|
objet->download_ticket = $_GET['download_ticket']; // le paramètre d'appel download_ticket correspond à celui utilisé lors de la création du lien
objet->start_download();
///////////////////////////////////////////////////////

Conclusion :


contenue du zip:
class_download.php: la classe dont il est question ici

class_basic.php: classe TRES BASIQUE d'accès à MySQL sur laquelle repose class_download.php. Si vous ne voulez pas l'utiliser, il vous sera facile de rétablir les commandes mysql_*

contantes_db.php: les constantes de paramétrage de class_basic.php

fiche.php: exemple de mise en place d'un lien de téléchargement

start_download.php: fichier de téléchargement à partir d'un ticket

downloads_table.sql: fichier d'importation sql permettant de mettre en place la table des downloads

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
60
Date d'inscription
lundi 1 décembre 2008
Statut
Membre
Dernière intervention
3 janvier 2011

Belle source !

Un petit up sur les commentaires précédents.

Et aussi pour dire que tu pourrais peut-être améliorer la "function generate_download_page()" qui ne gère pas par exemple la durée de download, ni les problèmes potentiels de buffer pour les gros fichiers.

Cet article pour illustrer mon propos, que tu as peut-être déjà lu :
http://fr.php.net/manual/fr/function.fread.php#63893
Messages postés
494
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
1 septembre 2011

Merci Kankrelune, ce tuto est effectivement très clair sur ce qu'il ne faut pas faire au niveau de la gestion des dates.
Bon, ben y a plus qu'à retrousser les manches et modifier mon script ET ma base de données.

Comme chez moi les semaines sont très longues (70 à 80h... hein? comment ça 35h? naaaaaan!? tu déconnes?), je n'ai toujours pas réussi à dégager le temps nécéssaire à la modification promise dans mon post précédent.
Mais je compte bien le faire prochainement car je dois implanter cette classe dans un projet en cours. Ce qui me donnera amplement l'oportunité de l'améliorer.

Merci encore pour vos commentaires


============================//===============================
il faudrait inventer des écrants à ultra-violet, je serais noir comme l'ebène!!! du moins du visage
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Au passage masternico concernant le timestamp tu prend la façon de procéder à l'envers... c'est pas à toi de faire la soustraction de timestamp pour créer ta requète SQL mais plutot ta SGDB de faire le calcul... tu y gagnera en perf et surtout en souplesse... peut être pas sur ce script en particulier mais d'une manière générale... .. .

un peu de lecture...

http://www.expreg.com/expreg_article.php?art=timestamp

@ tchaOo°
Messages postés
1
Date d'inscription
dimanche 14 décembre 2008
Statut
Membre
Dernière intervention
14 décembre 2008

merci mon ami de votre aide.vraiment ce ca ce que je voulais.syer sur que tu va trouver l'aide si vous avez une probleme.Merci de plus
Messages postés
494
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
1 septembre 2011

Salut Akhenathon,
Merci aussi à toi pour ce commentaire plus que constructif. Cette semaine je doit finir un projet et ensuite je modifirais cette classe en fonction de tes remarques.

Par contre, il en est certaines dont je ne tiendrais pas forcément compte car elles avaient déjà été le sujet d'une réflexion précédente (cependant, je suis ouvert au dialogue):
- répétition du filename: c'est volontaire. En fait, je pars du principe que le site dans lequel la classe sera greffée contiendra déja une table 'bibliothèque de fichier' et que mon source arrive comme un composant enfichable qui ne se souci pas du reste. Disons que ma classe ne se charge que de l'atribution du ticket, pas de la gestion de la bibliothèque
- utilisation des cookies... perso, j'en ai horreur. Rien qu'à l'idée que certaines personnes les désactive et qu'alors le script ne fonctionne plus... De toute façon ce n'est pas pour la place que celà prend dans la base de données ;)
- timestamp pas un varchar: tu as totalement raison. C'est juste que pour le nettoyage de la table de téléchargement, je trouve plus simple de faire une soustraction entre deux valeurs 'unix time' que de devoir calculer la différence entre deux timestamp. Par contre, c'est vrais que c'est une habitude que j'ai prise depuis longtemps et que du coup je ne me suis pas plus renseigné que ça sur le format TIMESTAMP de MySQL. C'est peut-être une erreur et je suis preneur d'idées...


Pour le reste, je garde tes idées que j'incluerais dans la prochaine modif, y compris le script de nettoyage ;)

Merci encore
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.