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

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

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.