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 :
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 :
En espérant que ça puisse servir à quelques uns
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:
$fichier = 'monfichier';
$chemin = 'telechargement/' . $fichier;
if (file_exists($chemin))
{
header('Content-disposition: attachment; filename="' . $fichier . '"');
header('Content-Type: application/force-download');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '. filesize($chemin));
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
readfile($chemin);
}
else
{
$erreurFichier = 'le fichier "' . $fichier . '" n\'existe pas. Veuillez-nous excusez pour le désagrément.';
}
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:
$fichier = 'monfichier';
$chemin = 'telechargement/' . $fichier;
if (file_exists($chemin))
{
header('Content-disposition: attachment; filename="' . $fichier . '"');
header('Content-Type: application/force-download');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '. filesize($chemin));
header('Pragma: no-cache');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
readfile($chemin);
}
else
{
$erreurFichier = 'le fichier "' . $fichier . '" n\'existe pas. Veuillez-nous excusez pour le désagrément.';
}