Petite classe PHP pour forcer le Téléchargement

Voici une petite classe PHP bien pratique et issue de Ludik FrameWork.

Elle est simple et sans prétention, mais je croise souvent des internautes qui souhaitent ce genre d’outils sur le web. Alors, en attendant que le Ludik FrameWork soit disponible en téléchargement, je vous met à disposition cette classe.

Cette classe qui se nomme downloadFile va vous permettre de forcer le téléchargement d’éléments que vous souhaitez faire Downloader. En effet, il arrive parfois que vous souhaitiez proposer un pdf en téléchargement et ce dernier s’affiche directement dans le navigateur. Voici une classe qui vous sera utile :

[pastacode lang= »php » manual= »%3C%3Fphp%20%0A%2F**%20%0A*%20%40package%20Ludik_FrameWork_0.5%20-%20Nacimiento%20%0A*%20%40author%20Franck%20Pertegas%20%0A*%20%40copyright%20LudiKreation%20%0A*%20%40link%20http%3A%2F%2Fwww.ludikreation.com%20%0A*%20%40license%20http%3A%2F%2Fwww.gnu.org%2Flicenses%2Flgpl.html%20GNU%20General%20Lesser%20Public%20Licence%2C%20see%20LICENCE%20file%20%0A*%20%40divers%20Issu%20du%20d%C3%A9veloppement%20pour%20des%20sites%20%3A%3A%20ludikreation%20de%20Franck%20Pertegas%20%0A*%20%40version%201.0.0%20%0A*%20%40Date%2001%2F05%2F2009%20%0A*%2F%20%0A%0A%2F**%20*%20downloadFile%20%0A*%20Classe%20de%20gestion%20de%20t%C3%A9l%C3%A9chargement%20-%20PHP%205%20oblige%20-%20A%20utiliser%20dans%20une%20page%20vierge%20de%20toute%20sortie%20!%20%0A*%20%40package%20Ludik_FrameWork%20%0A*%2F%20%0Aclass%20downloadFile%7B%20%0A%09%0A%09%2F**%20%0A%09*%20nom%20du%20fichier%20a%20t%C3%A9l%C3%A9charger%20%0A%09*%20%40var%20string%20%0A%09*%20%40access%20public%20%0A%09*%2F%20%0A%09public%20%24filename%3B%20%0A%09%0A%09%2F**%20%0A%09*%20nom%20du%20fichier%20pour%20la%20sauvegarde%20de%20l’internaute%20%0A%09*%20%40var%20string%20%0A%09*%20%40access%20public%20%0A%09*%2F%20%0A%09public%20%24newfilename%3B%20%0A%09%0A%09%2F**%20%0A%09*%20chemin%20pour%20arriver%20au%20fichier%20%0A%09*%20%40var%20string%20%0A%09*%20%40access%20public%20%0A%09*%2F%20%0A%09public%20%24filepath%3B%20%0A%09%0A%09%2F**%20%0A%09*%20taille%20du%20fichier%20%0A%09*%20%40var%20string%20%0A%09*%20%40access%20private%20%0A%09*%2F%20%0A%09private%20%24filesize%3B%20%0A%09%0A%09%2F**%20%0A%09*%20encodage%20n%C3%A9cessaire%20pour%20le%20fichier%20%0A%09*%20%40var%20string%20%0A%09*%20%40access%20private%20%0A%09*%2F%20%0A%09private%20%24filemd5%3B%20%0A%09%0A%09%2F**%20*%20Format%20de%20date%20de%20l’entete%20%0A%09*%20%40var%20string%20%0A%09*%20%40access%20public%20%0A%09*%2F%20%0A%09public%20%24dateformat%3B%20%0A%09%2F**%20%0A%09*%20Constructeur%20public%20%0A%09*%20%40param%20string%20%24filename%20%3A%3A%20le%20nom%20du%20fichier%20avec%20son%20extension%20bien%20sur%5E%5E%20%0A%09*%20%40param%20string%20%24filepath%20%3A%3A%20le%20chemin%20du%20fichier%2C%20par%20d%C3%A9faut%20 »%20%0A%09*%20%40param%20string%20%24newfilename%20%3A%3A%20le%20nom%20du%20fichier%20pour%20l’internaute%20par%20default%20%24filename%20%0A%09*%2F%20%0A%09public%20function%20__construct(%24filename%2C%20%24filepath%20%3D%20 »%2C%20%24newfilename%20%3D%20 »)%7B%20%0A%09%09%0A%09%09%24this-%26gt%3Bfilename%20%3D%20%24filename%3B%26lt%3Bbr%20%3F–%3E%20%24this-%26gt%3Bfilepath%20%3D%20self%3A%3AcleanPath(%24filepath)%3B%0A%09%09%24this-%26gt%3Bdateformat%20%3D%20’D%2C%20d%20M%20Y%20H%3Ai%3As’%3B%0A%09%09%24this-%26gt%3Bfilesize%20%3D%20filesize(%24this-%26gt%3Bfilepath.%24this-%26gt%3Bfilename)%3B%0A%09%09%24this-%26gt%3Bfilemd5%20%3D%20md5_file(%24this-%26gt%3Bfilepath.%24this-%26gt%3Bfilename)%3B%0A%0A%09%09if(%24newfilename%20%3D%3D%20 »)%0A%09%09%24this-%26gt%3Bnewfilename%20%3D%20%24this-%26gt%3Bfilename%3B%0A%09%09else%0A%09%09%24this-%26gt%3Bnewfilename%20%3D%20%24newfilename%3B%0A%0A%09%7D%0A%0A%09%2F**%0A%09*%20M%C3%A9thode%20public%20static%20(cleanPath(%5B…%5D))%20permettant%20d’ajouter%20le%20slash%20au%20chemin%20si%20ce%20dernier%20n’y%20est%20pas%0A%09*%20%40param%20string%20%24path%20%3A%3A%20le%20chemin%20entr%C3%A9%0A%09*%2F%0A%09public%20static%20function%20cleanPath(%24path)%7B%0A%0A%09%09%24path%20%3D%20%24path%3B%0A%0A%09%09if(substr(%24path%2C%20-1%2C%201)%20!%3D%20’%2F’)%7B%0A%0A%09%09%09%24path%20.%3D%20’%2F’%3B%0A%0A%09%09%7D%0A%0A%09%09return%20%24path%3B%0A%0A%09%7D%0A%0A%09%2F**%0A%09*%20M%C3%A9thode%20public%20static%20(getExtension())%20permettant%20d’obtenir%20l’extension%20du%20fichier%20pass%C3%A9%20en%20argument%20(Une%20methode%20de%20la%20Classe%20uploadFile)%0A%09*%20%40param%20string%20%24file%20%3A%3A%20le%20nom%20du%20fichier%20avec%20son%20extension%20bien%20sur%5E%5E%0A%09*%20%40return%20string%20l’extension%20(ex%20%3A%20%22jpg%22)%0A%09*%2F%0A%09public%20static%20function%20getExtension(%24file)%7B%0A%0A%09%09return%20substr(%24file%2C%20-3)%3B%0A%0A%09%7D%0A%0A%09%2F**%0A%09*%20M%C3%A9thode%20public%20(forceDownload())%20permettant%20de%20forcer%20un%20t%C3%A9l%C3%A9chargement%20de%20fichier%20-%20Renvoi%20plusieurs%20entete%20header%20!!%0A%09*%20%40return%20boolean%20si%20r%C3%A9ussite%20(true)%20ou%20non%20(false).%0A%09*%2F%0A%09public%20function%20forceDownload()%7B%0A%0A%09%09%2F%2F%0A%09%09%2F%2F%20Quelques%20%C3%A9l%C3%A9ments%20n%C3%A9cessaires%0A%09%09%2F%2F%0A%09%09error_reporting(0)%3B%0A%09%09ini_set(‘zlib.output_compression’%2C%200)%3B%0A%0A%09%09%2F*%0A%09%09*%20Les%20en%20tetes%20n%C3%A9cessaires%0A%09%09*%2F%0A%0A%09%09%2F%2F%0A%09%09%2F%2F%20Gestion%20du%20cache%0A%09%09%2F%2F%0A%09%09header(‘Pragma%3A%20public’)%3B%0A%09%09header(‘Last-Modified%3A%20′.gmdate(%24this-%26gt%3Bdateformat).’%20GMT’)%3B%0A%09%09header(‘Cache-Control%3A%20must-revalidate%2C%20pre-check%3D0%2C%20post-check%3D0%2C%20max-age%3D0’)%3B%0A%0A%09%09%2F%2F%0A%09%09%2F%2F%20Informations%20sur%20le%20contenu%20a%20envoyer%0A%09%09%2F%2F%0A%09%09header(‘Content-Tranfer-Encoding%3A%20none’)%3B%0A%09%09header(‘Content-Length%3A%20’.%24this-%26gt%3Bfilesize)%3B%0A%09%09header(‘Content-MD5%3A%20’.base64_encode(%24this-%26gt%3Bfilemd5))%3B%0A%09%09header(‘Content-Type%3A%20application%2Foctetstream%3B%20name%3D%22’.%24this-%26gt%3Bfilename.’%22′)%3B%0A%09%09header(‘Content-Disposition%3A%20attachment%3B%20filename%3D%22′.%24this-%26gt%3Bnewfilename.’.’.self%3A%3AgetExtension(%24this-%26gt%3Bfilename).’%22′)%3B%0A%0A%09%09%2F%2F%0A%09%09%2F%2F%20Informations%20sur%20la%20r%C3%A9ponse%20HTTP%20elle-meme%0A%09%09%2F%2F%0A%09%09header(‘Date%3A%20′.gmdate(%24this-%26gt%3Bdateformat%2C%20time()).’%20GMT’)%3B%0A%09%09header(‘Expires%3A%20′.gmdate(%24this-%26gt%3Bdateformat%2C%20time()%2B1).’%20GMT’)%3B%0A%09%09header(‘Last-Modified%3A%20′.gmdate(%24this-%26gt%3Bdateformat%2C%20time()).’%20GMT’)%3B%0A%0A%09%09%2F*%0A%09%09*%20Envoi%20du%20fichier%0A%09%09*%2F%0A%0A%09%09if(readfile(%24this-%26gt%3Bfilepath.%24this-%26gt%3Bfilename))%0A%09%09%09return%20true%3B%0A%0A%09%7D%0A%0A%7D%0A%0A%3F%3E » message= » » highlight= » » provider= »manual »/]

Bien entendu cette classe est issue de diverses sources et recherches et permet donc de forcer le download de fichiers.

Comment l’utiliser ?

Tout d’abords n’oubliez pas que votre page qui utilisera cette classe devra être vierge de toute sortie, afin de ne pas faire planter le script.

[pastacode lang= »php » manual= »%3C%3Fphp%20%0A%2F%2F%20Instanciation%20de%20l’objet%20(le%20fichier%20appel%C3%A9%2C%20le%20chemin%20vers%20ce%20fichier%2C%20la%20nouvelle%20appellation%20du%20fichier%20lors%20du%20t%C3%A9l%C3%A9chargement)%20%0A%24download%20%3D%20new%20downloadFile(‘monfichier.pdf’%2C%20’mesfichiers%2Fpdf’%2C%20’Mon-nouveau-nom-de-fichier’)%3B%20%2F%2F%20On%20force%20le%20download%20(return%20boolean)%20%0A%24download-%26gt%3BforceDownload()%3B%20%0A%3F%3E » message= » » highlight= » » provider= »manual »/]

 

Voilà, tout simplement et vous pouvez ainsi forcer le téléchargement et renommer le fichier ainsi téléchargé.

Pour toutes questions, remarques, contributions, n’hésitez pas…

Author: Franck Pertegas

Share This Post On

8 Comments

  1. Yo LudiKadmin,

    Effectivement je devait être un des nombreux internautes a chercher cette outil qui va me rendre je pense la vie un peu plus simple 🙂

    Il a fallut que je crame ma carte mére pour voir ton topic et découvrir se blog 😉

    Merci LudiKadmin continue comme ça=)

    Post a Reply
  2. Salut smelllike,

    Heureux que ça te plaise. En espérant que ça te serve 🙂

    Si tu as des améliorations ou ajouts, n’hésites pas je suis preneur.

    Bonne soirée

    Post a Reply
  3. Ha dommage je n’arrive pas à l’utiliser.

    j’ai mis la classe dans un fichier php externe et je fais un include(‘de la classe’)

    et je l’appel comme ceci
    forceDownload();
    }
    ?>

    ça déclanche quelque chose sauf que le résultat c’est décrire des carré bizare dans la page

    hum! peut être que je ne sais pas comment vraiment bien faire la chose

    salut

    Post a Reply
  4. Bonjour REM,

    Ça fonctionne même si ta classe est en include().

    Suis bien les instructions que je donne sur cet article.

    Il ne faut pas l’utiliser comme une fonction, mais bien comme une classe.

    A+

    Post a Reply
  5. ok, ça marche très bien.

    j’ai mis la classe et l’appel de la classe dans une page vide de tout contenu et voilà ça marche.

    par contre je fais exécuter la classe à partir d’un lien vers une page _blank. Le download se fait met on reste sur une page blanche vide.

    est-ce que tu aurais une idée pour plus de convivialité et ne pas se retrouvé sur une page blanche mais plutôt rester sur la page que je suis. Je suis capable de le faire mais je trouve ta classe super le fun et m’évite de toujours retaper dans l’entête le stock nécéssaire!

    merci beaucoup pour ton travail!

    voici l’adresse :
    http://aapq.org/aapq_evenement/dev/congres2013/inscription
    le lien est tout en haut de la page. télécharger le pdf

    Post a Reply
  6. Bonjour REM,

    oui, il suffit de ne pas mettre le lien avec target= »_blank »
    tu fais un lien normal et ça téléchargera le fichier sans te changer de page 🙂

    Post a Reply
  7. Effectivemnt! LudiKadmin

    maintenant c’est au poil!

    merci pour cette petite classe

    je crois qu’elle va suivre dans plein de projets différents

    salut

    Post a Reply
  8. Bonjour à tous, je voulais remercier LudiKadmin pour cette classe qu’il a créée mais j’ai une petite bug avec cette classe.
    Quand j’ai utilisé pour la première fois la classe ma machine a planté et j’ai du la forcer pour éteindre! et la deuxième fois ça s’est bien passée mais la troisième fois le problème que la première fois!!
    Je voulais vous demander pourquoi ça plante avant de mettre ça sur le serveur! Je travaille en local avec wampserver
    cordialement

    Post a Reply

Répondre à smelllike Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *