Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TÉLÉCHARGEMENT FICHIERS AVEC TICKET DE TÉLÉCHARGEMENT


Information sur la source

Catégorie :Fichier / Disque Classé sous : force, download, télécharger, class Niveau : Initié Date de création : 12/11/2008 Date de mise à jour : 12/11/2008 11:01:41 Vu / téléchargé: 4 702 / 386

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

12 novembre 2008 11:01:41 :
hmmm? on me demande une explication de modification alors que je n'ai pas encore publié?...

Commentaires et avis

signaler à un administrateur
Commentaire de petifa le 12/11/2008 14:02:34

slt,
ca m'a l'air très sympa ce code, et puis niveau commentaire tu fais ca bien, définir les variables et les fonctions en début, on voit tout de suite a quoi ca sert.
A tester pour ma part

signaler à un administrateur
Commentaire de masternico le 17/11/2008 07:15:41

Merci petifa pour ton commentaire    :)

Bon, ben, au moin je ne me suis pas fait descendre, donc ça ne doit pas être trop mauvais   ;)

signaler à un administrateur
Commentaire de aKheNathOn le 17/11/2008 11:03:43 8/10

Salut, l'idée est superbe j'ai donc regardé en profondeur ton travail. J'espère que mes remarques pourront t'aider à avancer dans ton projet :

* Au niveau de la base :

Tu as une table download, ce qui est dommage c'est la répétition du filename (le timestamp c'est pas un varchar). Perso je pense que tu aurais dû faire un table bibliothèque de fichiers et une autre contenant juste des tickets de téléchargements.

Afin de rendre le travail plus intéressant et exploitable, dans cette classe de tickets tu aurais pu y rajouter l'adresse IP du demandeur afin d'avoir le nombre de téléchargements uniques - ainsi que l'accès ou non au téléchargement.

Un ptit script avec un DELETE ... FROM ... WHERE aurait été appréciable également pour automatiser le vidage de la table.

* Au niveau du code :

Bien la classe d'abstraction de la base, manquerais une classes intermédiaire de mapping des données, et un controleur (tu fais les deux dans la même classe).

Pour générer le ticket essayes ce lien :
http://fr3.php.net/uniqid - tu y trouveras ce que tu veux.

La classe qui permet de créer le ticket devrait juste retourner le code du ticket généré - au développeur de mettre en page son lien de téléchargement ;)

Concernant la génération - à chaque visite de la fiche.php un nouveau id est généré - tu aurais pu le mettre en cookie histoire d'éviter trop d'enregistrements dans la base.

* Au niveau de l'idée :

Très bonne idée de classe ! Juste un petit commentaire - il faudrait pouvoir distingue plusieurs types d'accès : accès définit dans le temps et accès permanent - certains fichiers peuvent être mis en lien à partir d'autres sites.

Je t'ai mis 8/10 car c'est une très bonne idée et ton script tient la route - je t'encourage à l'améliorer pour qu'il puisse devenir une brique de téléchargement utilisable sur n'importe quel site.

signaler à un administrateur
Commentaire de masternico le 19/11/2008 09:41:43

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

signaler à un administrateur
Commentaire de chams87 le 14/12/2008 23:04:29

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

signaler à un administrateur
Commentaire de kankrelune le 10/01/2009 12:48:51

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°

signaler à un administrateur
Commentaire de masternico le 10/01/2009 21:56:05

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Force download, questions... MERCI DE M'AIDER [ par kipy ] Salut à tous. enfaite ce que je voulais vous demander, est-il possible de forcer le téléchargement d'une url déjà forcé exportation, force-download, refresh [ par rocknroll2 ] Re RE Re Slt à tous,De nouveau avec vous pour un big blème.... :(J'ai 1 page avec 1 partie "menu" a gauche et page principale à droite. Là je suis for brute force [ par demonheart69 ] voila jai instalé brutus et je suis completement perdu jaurai besoin d'un peu d'aide alors si y a qqn dasser gentil pr maider ce serai cool Serveur SMTP [ par Marion0904 ] Bonsoir, J'essai d'nvoyer des mails en utilisant la class phpmailer (disponible sur  http://phpmailer.sourceforge.net/). J'incu la class php mail Telechargement bien terminé !! [ par orsam ] Bonjour à tous !Une petite question : Comment savoir si un download s'est bien terminé ?Je m'explique ! J'ai une source, qui genere un zip s Protégé fichier contre download [ par malik7934 ] Hello, Comment fait-on pour protéger un fichier dans un dossier contre le téléchargement de personnes non-identifiées? Je m'expl Download - Redirection [ par oleander ] Bonjour,Je sais que les questions sur le download de fichiers en PHP  polluent le forum mais pas moyen de trouver la solution download de fichier pdf [ par matheo54 ] Bonjour,j'aurais une petite question, j'aimerai savoir comment faire pour qu'un utilisateur de mon site puisse télécharger un fichier pdf. E templates avec poo [ par lesnes ] bonjours je reprogramme totalement mon site en poo et je souhaiterai utiliser les templates mais l'on ne peut pas faire appel a une class exterieur a bouton parcourir + download d'image [ par joebar3333 ] Bonjour,je cherche à réaliser une page php ayant la fonctionnalité, via un bouton parcourir, de sélectionner un fichier sur l'ordi


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.