Faire un lien de téléchargement (fichier.pdf) sans l'afficher dans le navigateur

subsole

Membre vénérable
Club iGen
16 Octobre 2010
11 183
3 522
Bonjour
Comment faire un lien de téléchargement depuis un site (fichier.pdf) sans que celui-ci s'ouvre dans le navigateur, et se place dans le dossier Téléchargements (si c'est le dossier utilisé par le navigateur évidemment) ?
J'ai déjà vu cela depuis un Mac, sur un site (je ne sais plus lequel :( ) en cliquant sur le lien , le PDF se plaçait dans téléchargements sans aucune action de l'utilisateur, et sans s'afficher dans le navigateur.
 
  • J’aime
Réactions: pouppinou et subsole
Malheureusement la solution proposé dans le lien de @r e m y reste encore souvent non reconnu par beaucoup de navigateur. Par exemple chez moi cela ne fonctionne pas (Opera 55, Safari 10.1.1, Firefox 62.0.3).
Moi je fais avec PHP.
Soit un fichier "telecharger.php" à la racine de ton site par exemple :
Bloc de code:
<?php
// on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions
switch(strrchr(basename($File), ".")) {
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;
case ".mp4": $type = "video/mp4"; break;
default: $type = "application/octet-stream"; break;
}
header("Content-disposition: attachment; filename=$File");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".filesize($chemin . $File));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");
readfile($chemin . $File);
?>

Ensuite tu n'as plus qu'à écrire tes liens dont tu veux absolument un téléchargement comme cela :
Bloc de code:
<a href="telecharger.php?File=toto.pdf&chemin=nom_du_dossier_ou_se_trouve_toto/"TOTO</a>
toto.pdf est le nom du fichier que tu veux faire télécharger.
nom_du_dossier_ou_se_trouve_toto , par exemple dossier_pdf (là où se trouve le fichier toto.pdf).

Exemple à tester : ICI
 
Dernière édition:
Merci pouppinou
Effectivement l'exemple donné dans le lien de r e m y ne fonctionne pas, ça date un peu (2012 ;) ).
Je vais tacher de mettre en pratique ton code.
 
Petite erreur de frappe dans le code du lien, il manque un ">" à la balise <a>, soit :
Bloc de code:
<a href="telecharger.php?File=toto.pdf&chemin=nom_du_dossier_ou_se_trouve_toto/">TOTO</a>
 
Merci pouppinou, mais je pense utiliser plus simple.
Dans cet exemple, le fichier à télécharger se trouve des le dossier dl.
Bloc de code:
<a href="dl/toto.pdf" download="toto">
         <img src="dl/12.jpg" alt="" width="70"></a>
 
C'est étrange car c'est exactement le même code que dans l'exemple à @r e m y mais là cela fonctionne. J'avais fait confiance à la page explicative du lien de @r e m y mais pas testé dans un de mes codes.
Et là, je l'ai testé en écrivant directement le code avec un fichier vidéo et effectivement cela fonctionne bien avec tous mes navigateurs. Mais par contre je préfère mettre l'extension au bout du nom du fichier car sinon on a pas l'extension du fichier téléchargé et donc pas l'icône du fichier.
 
Effectivement pour l'extension c'est mieux avec pour avoir l'icône avec Firefox par exemple, tandis que Safari s'en fout avec ou sans extension j'ai l'icône , conclusion il faut mettre l'extension. :D
Merci r e m y. :coucou:
 
Dernière édition:
Perso, pour une compatibilité avec iOS , je ne mettrai pas de dossier a télécharger mais plutôt un onglet. La personne peut ainsi décider de garder ou pas le document.