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

subsole

Vénérable sage
Club MacG
16 Octobre 2010
11 142
3 521
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.
 

r e m y

Cas clinique
Club MacG
4 Novembre 2000
41 492
4 308
59
St Germain en Laye - FRANCE
  • J’aime
Réactions: pouppinou et subsole

pouppinou

Une vie de Chien et de Pommé, et je suis heureux !
17 Juin 2017
2 290
2 170
49
Niche.
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:

subsole

Vénérable sage
Club MacG
16 Octobre 2010
11 142
3 521
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.
 

pouppinou

Une vie de Chien et de Pommé, et je suis heureux !
17 Juin 2017
2 290
2 170
49
Niche.
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>
 

subsole

Vénérable sage
Club MacG
16 Octobre 2010
11 142
3 521
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>
 

pouppinou

Une vie de Chien et de Pommé, et je suis heureux !
17 Juin 2017
2 290
2 170
49
Niche.
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.
 

subsole

Vénérable sage
Club MacG
16 Octobre 2010
11 142
3 521
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:

USB09

Membre d’élite
27 Mars 2008
1 938
211
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.