Forcer le téléchargement d'un fichier

Rechercher

Forcer le téléchargement d'un fichier

  • Par Emacs
  • 3 commentaires
  • 2 749 lectures
  • De Hugo HAMON
  • RSS -  Atom

Cette portion de script présente un moyen simple et efficace de forcer le téléchargement d'un fichier. Comment ça forcer un téléchargement ? Prenons l'exemple concret d'un fichier PDF car c'est celui qui semble le plus approprié pour ce genre de code.

L'utilisation d'un document PDF peut varier d'un utilisateur à un autre. En effet, certains pourront l'ouvrir directement dans leur navigateur via un plugin intégré tandis que d'autres seront obligés de le télécharger puis de l'ouvrir avec Adobe Acrobat Reader par exemple. Afin d'uniformiser ces différents comportements, nous pouvons choisir de forcer le téléchargement du document.

Portion de code

<?php
  /*******************************************************
  *  Déclaration de la fonction
  *******************************************************/
  /**
   *  La fonction force le téléchargement d'un fichier
   *
   * @author : Hugo HAMON
   * @param : string $situtation emplacement sur le serveur web
   * @return : void
   **/
  function forcerTelechargement($situation)
  {
    header('Content-Type: application/octet-stream');
    header('Content-Length: '. filesize($situation));
    header('Content-disposition: attachment; filename='. basename($situation));
    header('Pragma: no-cache');
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    header('Expires: 0');
    readfile($situation);
    exit();
  }
  /*******************************************************
  *  Appel de la fonction
  *******************************************************/
  forcerTelechargement('./documents/compte.pdf');
?>

Les commentaires

1. Par Sowhat le 27/10/2007 13:09

Je trouve que c'est mieux de se passer du troisième argument en faisant :
header('Content-Length: '. filesize($nom));
Non ?

2. Par Sowhat le 27/10/2007 13:10

header('Content-Length: '. filesize($emplacement));
Plutôt

3. Par Emacs le 27/10/2007 17:33

Oui tu as raison, je n'y avais pas pensé sur le coup.

J'ai mis à jour la fonction en l'optimisant encore un peu. Désormais, elle ne prend plus qu'un seul paramètre : le chemin vers le fichier à télécharger.

++

Hugo.