vendredi 26 Sep 2008

Forcer le téléchargement des .PDF

PHPAvec certains logiciels de lecture PDF, notamment le plus répandu Adobe Acrobat Reader, le réglage par défaut ouvre les PDF dans le navigateur quand on clique sur un lien vers un PDF.

En tant que webmaster vous pouvez forcer la boite de dialogue du navigateur permettant de choisir de l'ouvrir directement ou de l'enregistrer. :-)

Tout d'abord, vous avez besoin de créer un petit fichier PHP qui contient ceci:

<?php
if (file_exists ($_GET['f']))
{
  header('Content-type: application/force-download');
  header('Content-Disposition: attachment; filename=' . basename ($_GET['f']));
  readfile($_GET['f']);
}
else
{
  header('HTTP/1.0 404 Not Found');
  echo 'Erreur, ce fichier n\'existe pas.';
}
?>

Que fait ce script? Il envoie une entête disant au navigateur qu'il faut forcer le téléchargement pour ce fichier, puis le nom à proposer dans la boite de dialogue, et enfin envoie le fichier.

Si le fichier n'existe pas, il renvoie une erreur 404. Le message d'erreur peut être embelli, voire inclus dans le design de votre site. ;-)

J'appelle ce fichier _pdf.php. Ensuite, il faut pouvoir passer par ce fichier lorsqu'on met un lien vers un PDF.


1er cas, votre serveur supporte la réécriture d'adresse

C'est le plus simple, il suffit de rajouter ceci ou créer un fichier .htaccess avec ceci:

RewriteEngine on
RewriteRule ^(.*).pdf$ _pdf.php?f=$1 [L]

Au lieu d'ouvrir un fichier .pdf directement, cela l'envoie au fichier _pdf.php qui va donc forcer le téléchargement.

2d cas, votre ne supporte pas la réécriture d'URL

Ça sera plus fastidieux puisqu'il faudra réécrire à la main :-| les liens vers les PDF. Au lieu d'un lien vers fichier.pdf mettre :arrow: _pdf.php?f=fichier.pdf

Si vous ne savez pas dans quel cas vous êtes, essayez le 1er, si ça ne marche pas c'est cette seconde solution qu'il faut choisir.


café Cet article vous a aidé? 
Offrez-moi un café!
Agrégateur informatique

9 réponses à “Forcer le téléchargement des .PDF”

  1. 1
    Bob (webcyclopedie.com) a dit:

    Bonjour et merci pour l'astuce.

    Cependant, avec la méthode 1 j'ai une erreur 500, avec la méthode 2 j'ai systématique le droit à "Erreur, ce fichier n'existe pas."

  2. 2
    David (azur-dev.kizone.net) a dit:

    Pour l'erreur 500 c'est que le serveur ne doit pas supporter ces instructions dans le .htaccess (généralement c'est volontairement bloqué par l'admin).

    Pour la 2de méthode, c'est qu'il y a une erreur de chemin sans doute. Le _pdf.php doit être dans le même dossier que les PDF, sinon il faut le modifier pour adapter...

  3. 3
    Bob (webcyclopedie.com) a dit:

    La structure du site est:
    /_pdf.php
    /dosc/pdfs/rep1/pdf1.pdf
    /dosc/pdfs/rep2/pdf2.pdf
    ...

    C.a.d que les PDF ne sont jamais au même endroit.

  4. 4
    David (azur-dev.kizone.net) a dit:

    D'accord, en fait il faudrait enlever la fonction basename(), je ne sais même plus pourquoi je l'avais mise. :-|

    header('Content-Disposition: attachment; filename=' . $_GET['f']);

    Je ne pense pas que les / poseraient problème en utilisant ensuite _pdf.php?f=/docs/pdfs/rep1/pdf1.pdf

  5. 5
    Bob (webcyclopedie.com) a dit:

    J'essaye et je vous tiens au courant. Cependant, pourquoi cette règle précise serait bloqué par l'admin serveur (htaccess) vu que toutes autres règles fonctionnent sans problème? Merci pour votre aide.

    Si vous le souhaitez n'hésitez à publier vos tutoriels sur mon site http://www.webcyclopedie.com

  6. 6
    David (azur-dev.kizone.net) a dit:

    Peut-être tout simplement que la réécriture d'adresse n'est pas activée. Il faudrait lui demander! ;-)

    Je ne vois pas ce que ça me rapporterai de publier des tutoriels ailleurs.

  7. 7
    Bob (webcyclopedie.com) a dit:

    Si elle l'est car j'utilise plein de règles :)

  8. 8
    David (azur-dev.kizone.net) a dit:

    Ah, le problème est qu'il s'était mis un retour à la ligne inutile. J'ai corrigé l'article:

    RewriteRule ^(.*).pdf$ _pdf.php?f=$1 [L]

  9. 9
    Bob (webcyclopedie.com) a dit:

    LOL. je me demande comment j'ai pu commetre une telle erreur moi aussi. Enfin, j'essayerai tout ça ;)

Laisser un commentaire

Azur Dev