FORUM Tom's Hardware » Programmation » PHP & MySQL & ASP » [info] [php] Forcer un téléchargement
 

[info] [php] Forcer un téléchargement

Il y a 289 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : [info] [php] Forcer un téléchargement
 
Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

Il est parfois intéressant ou nécessaire de forcer le téléchargement d'un fichier. Rien d'indélicat ou de sournois dans le principe. :jap:
 
Un ex. qui devrait parler à Johann & Pirlouit : il est parfois préférable de pouvoir télécharger un document pdf plutôt que de le voir s'ouvrir dans son navigateur. C'est intéressant quand le pdf est de grosse taille, que la lecture du contenu n'est pas nécessaire dans l'immédiat, etc. Dans le cas qui m'intéressait aujourd'hui, le but était de laisser le choix au visiteur entre voir ou télécharger des pdf, et ce sans devoir utiliser le fastidieux menu contextuel (clic droit) pour les néophytes.
 
Quelques rapides recherches m'ont dirigé vers un code basé sur l'envoi de header http. Ce code permet d'afficher la fenêtre de téléchargement des navigateurs ; il peut ressembler à ceci :

Code :
  1. $fichier = 'monfichier';
  2. $chemin = 'telechargement/' . $fichier;
  3. if (file_exists($chemin))
  4. {
  5.     header('Content-disposition: attachment; filename="' . $fichier . '"');
  6.     header('Content-Type: application/force-download');
  7.     header('Content-Transfer-Encoding: binary');
  8.     header('Content-Length: '. filesize($chemin));
  9.     header('Pragma: no-cache');
  10.     header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
  11.     header('Expires: 0');
  12.     readfile($chemin);
  13. }
  14. else
  15. {
  16.     $erreurFichier = 'le fichier "' . $fichier . '" n\'existe pas. Veuillez-nous excusez pour le désagrément.';
  17. }


On retrouve un code similaire à celui-ci un peu partout sur le Web. Il marche bien, pas de souci... du moins tant qu'on se contente de vraiment enregistrer le fichier cible.
 
Seulement voilà, les navigateurs proposent aussi d'ouvrir le fichier à télécharger (c'est les choix "ouvrir" du menu de téléchargement). Dans ce cas, le code marche toujours, sauf pour IE (comme par hasard diront les mauvaises langues ;) ). Dans le cas d'un pdf par exemple, IE récupère bien le fichier, ouvre bien Adobe Reader, mais pas de bol, Reader affiche un message d'erreur comme quoi le fichier pdf n'existe pas :/
 
Il est en fait assez simple de remédier au problème, puisqu'il ne s'agissait que d'un Cache-control trop restrictif pour IE. Il faut supprimer les option "no-cache" et "no-store". On obtient au final ce code qui marche même pour l'option "ouvrir" de d'Internet Explorer :

Code :
  1. $fichier = 'monfichier';
  2. $chemin = 'telechargement/' . $fichier;
  3. if (file_exists($chemin))
  4. {
  5.     header('Content-disposition: attachment; filename="' . $fichier . '"');
  6.     header('Content-Type: application/force-download');
  7.     header('Content-Transfer-Encoding: binary');
  8.     header('Content-Length: '. filesize($chemin));
  9.     header('Pragma: no-cache');
  10.     header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  11.     header('Expires: 0');
  12.     readfile($chemin);
  13. }
  14. else
  15. {
  16.     $erreurFichier = 'le fichier "' . $fichier . '" n\'existe pas. Veuillez-nous excusez pour le désagrément.';
  17. }


En espérant que ça puisse servir à quelques uns :)

Inside my own Second Life

Et hop, noté ;) !
 
Je vais l'essayer de ce pas..
 
:jap:


---------------
Retrouvez moi sur mon blog : http://www.nicolasullern.net/leblog/
Et aussi sur :
http://www.linkedin.com/in/nicolasullern
http://www.viadeo.com/fr/profile/nicolas.ullern
http://www.copaing.net/johanpirlouit/

Je ne comprend pas comment utiliser ce code dans une page où il y a plusieurs fichiers à télécharger. Eclairez-moi s'il vous plait.
 
Comme je l'explique dans un autre sujet, j'aimerai que les musiques de ma page http://dj.dom.free.fr/v3/musiques_fr.php se téléchargent au lieu de se lire lorsque mes visiteurs cliquent dessus.


---------------
Visitez Mon Site et Le zoo du Pr Savanfou
Plus d'informations

Salut,
 
Ce script est top pour faire du force-download de fichiers locaux qu'on a sur son serveur.
 
Le pb c'est que j'essaye de faire du force-download à partir d'une page de mon site, mais qui téléchargerait une page sur un site qui n'est pas à moi (le fichier est énorme et je ne veut pas le mettre sur mon serveur).
 
Or qd je remplace :
readfile(fichier local );
par
readfile(http://cheminversfichierdistant);
 
ca ne marche pas. Quelqu'un peut m'aider ?
 
Merci !!
 
A+
 
David


Message édité par daveledave le 06-07-2007 à 18:29:55
pourquoi faire cent fois la même chose ?
Plus d'informations

simple : c'est une mauvaise idée.
 
c'est une mauvaise idée du point de vue technique car le traffic va passer du serveur distant à ton serveur puis au client. si l'autre serveur est pas sur le même réseau alors la lenteur du téléchargement risque d'augmenter et tu va gaspiller de la bande passante. et de plus tu pourrai faire un effort et ne pas linker à l'arrache les fichiers d'un autre site ;) ...
 
le mieux c'est de faire ça sur l'autre serveur.


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » PHP & MySQL & ASP » [info] [php] Forcer un téléchargement
 

Annonces Google
Publicité