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.
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 :
$erreurFichier = 'le fichier "' . $fichier . '" n\'existe pas. Veuillez-nous excusez pour le désagrément.';
}
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 :
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
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 ...