Forcer le téléchargement d'un fichier avec PHP

Dance cet article nous allons voir comment forcer le navigateur à télécharger un fichier (n’importe lequel) au lieux de l’ouvrir. Pour cela nous allons utiliser les Headers qu’envoie le serveur au navigateur (fonction header de php).

Voici le code a utiliser :

 //date actuelle
$date = gmdate('D, d M Y H:i:s');
 
header("Content-Type: text/xml"); //Ici par exemple c'est pour un fichier XML, a changer en fonction du type mime du fichier voulu.
header('Content-Disposition: attachment; filename=NOM_FICHIER.xml');
header('Last-Modified: '. $date . ' GMT');
header('Expires: ' . $date);
//header specifique IE :s parce que sinon il aime pas
if(preg_match('/msie|(microsoft internet explorer)/i', $_SERVER['HTTP_USER_AGENT'])){
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
}else{
  header('Pragma: no-cache');
}
 
echo $CONTENU_DE_NOTRE_FICHIER; // ou readfile('CHEMIN_FICHIER'); En fonction du type de fichier.

Le type Mime doit être celui du fichier qu’on veut pouvoir télécharger (liste des types mime disponibles). En voici quelques exemples :

image GIF : image/gif
fichier XML : text/xml
fichier rtf : application/rtf
fichier avi : video/msvideo

Maintenant à vos fichiers dl.php 😉

Share

11 Comments

  1. Merci beaucoup pour ce petit script qui marche impecable, moi aussi j’ai eu du mal avec ie!!
    Petit plus pour la sécurité: une condition qui empêche de prendre n’importe quel extension:
    if(ereg(« .pdf »,$fichier){…}
    Remplacer « .pdf » par l’extension que vous souhaitez mettre en téléchargement, « $fichier » la var qui contient le nom du fichier.
    Bon ereg() est deprecated mais ca marche!!!
    ++

    Répondre

  2. Bonjour,
    J’ai lu votre rubrique de téléchargement avec script PHP. J’aimerais télécharger un fichier ‘Virtuel.exe’ situé dans ‘http://jacques.dupont.free.fr’ soit: http://jacques.dupont.free.be/Virtuel.exe (mon site web)

    Je n ai aucune connaissance particulière en PHP, comment dois-je adapter ce script pour le téléchargement de ce fichier ‘Virtuel.exe’.

    J’ai essayé de l adapter, mais sans aucun résultat….
    Je vous remercie beaucoup,

    Phy

    Répondre

    1. Bonjour,

      normalement pour le .exe il n’y rien a faire, il suffit d’appeler l’url exacte du fichier (.exe) et il sera proposé au téléchargement automatiquement.

      la solution proposée sur ce billet est valable pour des fichiers texte (donc lisibles directement sur le navigateur), des images, etc. où parfois on aimerait que le navigateur les propose au téléchargement au lieux de les ouvrir directement.

      Cordialement,

      Répondre

  3. Super ce script!

    Juste un soucis de mon côté : il s’agit d’un xml que je veux ouvrir avec excel.
    J’enregistre puis ça ne marche pas à cause d’un espace qui est ajouté à mon xml de départ.
    il n’y a pas d’espace.
    Par le site, il y en a un.
    Peut-être pourrais tu m’aider?

    Cordialement,
    Anthony.

    Répondre

  4. J’ai eu le même problème (les espaces avant) même en utilisant le readfile

    Il faut mettre ca avant le readfile

    ob_clean();
    flush();

    Et ca marche!!!

    Répondre

  5. Bonjour alors je dois être nul car moi je créé un dossier php et je met ce code, ensuite je fais pointer le lien de mon téléchargement sur le fichier php mais celà ne fonctionne pas. Pourriez-vous m’expliquer ?

    J’ai donc mis ceci dans mon fichier php :

    //date actuelle
    $date = gmdate(‘D, d M Y H:i:s’);

    header(« Content-Type: text/txt »); //Ici par exemple c’est pour un fichier XML, a changer en fonction du type mime du fichier voulu.
    header(‘Content-Disposition: attachment; filename=présentation.txt’);
    header(‘Last-Modified: ‘. $date . ‘ GMT’);
    header(‘Expires: ‘ . $date);
    //header specifique IE :s parce que sinon il aime pas
    if(preg_match(‘/msie|(microsoft internet explorer)/i’, $_SERVER[‘HTTP_USER_AGENT’])){
    header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0’);
    header(‘Pragma: public’);
    }else{
    header(‘Pragma: no-cache’);
    }

    echo $CONTENU_DE_NOTRE_FICHIER; // ou readfile(‘CHEMIN_FICHIER’); En fonction du type de fichier.

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *