Forcer le téléchargement des liens PDF

Rien n’est plus agaçant que de lancer l’ouverture d’un fichier PDF en cliquant sur un lien dans une page web… d’autant plus désagréable lorsque le fichier en question est lourd, ce qui est souvent le cas pour ce type de fichiers (catalogues ou manuels par exemples)
Or c’est pourtant l’action par défaut que proposent la plupart des navigateurs…
. Il existe une solution simple pour forcer le téléchargement :
Cliquez ici pour voir un exemple sans forcer le téléchargement
Cliquez ici pour voir un exemple en forçant le téléchargement
Première étape :
mettre dans le même dossier que le fichier PDF (test.pdf pour l’exemple) un fichier PHP intitulé : telecharge.php :
<?php
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=$_GET[pdf]");
readfile($_GET['pdf']);
?>
Deuxième étape :
Sur la page web concernée, créer le lien de téléchargement du PDF test.pdf ainsi :
<a href="../pdf/telecharge.php?pdf=test.pdf">télécharger test.pdf</a>
Et voilà… c’est tout



Merci, c’est cool
Salut,
Voilà une astuce intéressante, je vois que je ne suis pas le seul à maudire la lecture de pdf dans les navigateurs :biggrin:
Merci
bonjour, j’ai essayer d’adapter votre code à mon script, mais ça ne marche tjrs pas!! j’ai crée le fichier telecherger.pdf et dans ma page php j’ai mis:
(‘point’)
$dir = opendir($dir_nom) or die(‘Erreur de listage : le répertoire n\’existe pas’); // on ouvre le contenu du dossier courant
$ifichier= array(); // on déclare le tableau contenant le nom des fichiers
$dossier= array(); // on déclare le tableau contenant le nom des dossiers
while($element = readdir($dir)) {
if($element != ‘.’ && $element != ‘..’ && $element != ‘index.php’) {
if (!is_dir($dir_nom.’/’.$element)) {$fichier[] = $element;}
else {$dossier[] = $element;}
}
}
closedir($dir);
$hide = Array(‘.’,’..’);
if(!empty($dossier)) {
rsort($dossier); // pour le tri croissant, rsort() pour le tri décroissant
echo « Voici les dossiers accessibles de la ‘$dir_nom’ : \n\n« ;
echo « \t\t\n »;
foreach($dossier as $lien){
if(in_array($lien, $hide))
continue;
echo « \t\t\t$lien\n »;
}
//echo « \t\t »;
}
/*if(!empty($fichier)){
sort($fichier);// pour le tri croissant, rsort() pour le tri décroissant
echo « Liste des divers fichiers en hebergement temporaire: \n\n »;
echo « \t\t\n »;
foreach($fichier as $lien) {
echo »
\t\t\t$lien\n
Vide
« ;
echo filesize(image.’/’.$lien);
echo »
Telecharger« ;
}
echo « \t\t »;
}
*/
/*if(!empty($fichier)){
sort($fichier);// pour le tri croissant, rsort() pour le tri décroissant
echo « Voici les fichiers accessibles de la ‘$dir_nom’ : \n\n« ;
echo « \t\t\n »;
foreach($fichier as $lien) {
echo « \t\t\t$lien\n »;
}
echo « \t\t »;
}*/
?>
télécharger arbre.pdf
svp , st ce que vous pouvez m’aider à confuser ces deux script pour qu’il marche, merci d’avance
C’est difficile à dire sans le reste du code.
Il doit y avoir une erreur PHP quelque part… Si les messages d’erreur ne s’affichent pas sur ton site, met un fichier .htaccess pour les afficher (voir ici : http://www.webtolosa.com/2007/12/09/debuguer-un-site-en-php-avec-un-htaccess/)
Qu’est ce que tu obtiens comme message d’erreur ?
salut
merci pour l’astuce, très simple à mettre en place. :biggrin:
bye
Merci pour l’astuce
C’est simple mais encore faut-il y penser :biggrin:
+++
Merci,
Depuis quelques jour j’étais confronter aux aberrations des navigateurs lors de demande de téléchargement (http) de .pdf et enfin, la solution.
Merci.
merci bien,
après avoir essayé différents scripts php plus compliqués les uns que les autres et qui me donnaient, au mieux, un pdf corrompu, enfin un tout simple et qui fonctionne xD
cela dit, en cherchant je suis souvent tombé sur des mises en garde concernant la possibilité de hacker par le biais d’un téléchargement forcé (télécharger d’autres fichiers avec les connexion bdd par ex), est-ce que celui ci est sûr ? que peut-on lui ajouter pour renforcer la sécurité ??
Bonjour Daniel,
il n’y a pas de scripts sans risques … mais celui-ci me semble nettement moins dangereux que n’importe quel formulaire de base. Regarde cet article : http://goo.gl/EeXqB, tu y trouveras 90% des failles exploitées par 90% des hackers. Ça devrait suffire à sécuriser tes sites, à moins que tu ne développes pour le pentagone …!
merci de la précision et article très intéressant.
J’ai essayé, connais le html et le css mais rien en php, suivi les consignes et ça marche impec !
Merci !
Bonjour,
Merci pour cette astuce simple (que j’ai mis un peu de temps à comprendre quand même j’avoue). Tu m’as épargné bien des recherches sur internet pour forcer un téléchargement et maintenant mon site est un cran plus pro ^^. Merci!
MERCI!!!!!!!
!
bon sang c’était pas compliqué ça fais 2h que je cherche ça
encore merci
he! le pro vous moij’utilisele html comment dois je faire pour force le télechargement de fichier pdf ou pps.
vous pouvez m’envoyez le code sous mon adresse E-mail.
Merci à tous.
@EMMAN RMS : fais un petit effort, lis ! Tout est expliqué dans le post ci-dessus ^^
slt!j’arrive a ouvrir le fenetre de telechergement mais le problem c’est que une fois le fichier telecharger je ne peut plus la lire.aide moi svp.
As tu essaye de l’enregistrer sous une version plus ancienne ? Par défaut je crée toujours mes PDF pour être lus avec adobe 6…
Ma petite contribution après avoir trouvé votre excellent bout de code…
La même chose, mais pour plusieurs types de fichiers. Dans mon exemple, cela suppose que la page dans laquelle se trouve le lien soit en php (ou html mais reconnue comme du php en modifiant le fichier apache) pour transmettre des variables en session :
SUR LA PAGE DANS LAQUELLE SE TROUVE LE LIEN :
// on cherche l’extension du fichier à télécharger
$term = strrchr(basename($fichier_a_telecharger), « . »);
switch($term) {
case « .gz »: $type = « application/x-gzip »; break;
case « .tgz »: $type = « application/x-gzip »; break;
case « .zip »: $type = « application/zip »; break;
case « .pdf »: $type = « application/pdf »; break;
case « .png »: $type = « image/png »; break;
case « .gif »: $type = « image/gif »; break;
case « .jpg »: $type = « image/jpeg »; break;
case « .txt »: $type = « text/plain »; break;
case « .htm »: $type = « text/html »; break;
case « .html »: $type = « text/html »; break;
default: $type = « application/octet-stream »; break;
}
$term = substr($term, 1);// on supprime le . avant l’extension
// les variables en session
$_SESSION['fichier_a_telecharger'] = $fichier_a_telecharger;
$_SESSION['term'] = $term;
$_SESSION['type'] = $type;
// le lien
echo « télécharger le fichier« ;
ON CREE ENSUITE LE FICHIER « telecharger.php » (DANS LE MËME DOSSIER QUE LES FICHIERS A TELECHARGER)
On peut aussi préférer transmettre les variables autrement que par sessions…
OUpsss, le lien a été converti…
Je le saisi autrement (il faudra supprimer les *)
// le lien
echo « télécharger »;
Bon, ça marche pas !!! Le modérateur trouvera la solution
Merci.
LE FICHIER « telecharger.php (ne pas oublier de créer la balise d’ouverture et fermeture de la page php…)
session_start();
$fichier_a_telecharger = $_SESSION['fichier_a_telecharger'];
$term = $_SESSION['term'];
$type = $_SESSION['type'];
header(« Content-type: $type »);
header(« Content-Disposition: attachment; filename=$_GET[$term]« );
readfile($_GET[$term]);