Forcer le téléchargement

Bonjour,

je sais que la question à déjà été posée mais je n'arrive pas à résoudre mon problème. Je dois en fait forcer le téléchargement d'un fichier mais mon fichier peut être un pdf ou une image ou un txt.
Voici ce que j'ai fait :
<a href='../download.php?file=".$do['nom_fichier']."&chemin=".$do['lien']."' target='_blank'>".$do['nom']."</a>

Et voici mon fichier download.php
<?php
/* $file = $_GET["file"];

header("Content-Type: application/octet-stream");
//header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=".$file);
header("Content-Type: application/force-download");
readfile($file); 
//header("Location:".$file); */

$Fichier_a_telecharger = $_GET['file'];
$chemin = $_GET['chemin'] ;

//echo $chemin."<br/>".$Fichier_a_telecharger ;

 switch(strrchr(basename($Fichier_a_telecharger), ".")) {

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;
default: $type = "application/octet-stream"; break;

}

header("Content-disposition: attachment; filename=".$Fichier_a_telecharger);
header('Content-Type: application/force-download');
//header("Content-Type: ".$type); 
header("Content-Transfer-Encoding: ".$type."\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");
readfile($chemin . $Fichier_a_telecharger);  



?>

si c'est un fichier txt ca marche mais si c'est un pdf par exemple il me dit que j'ai une erreur ou que le fichier est corrompu.

Merci de votre aide

2 réponses

  1. Bonjour,

    A priori, de ce que j'en vois, le problème doit se situer au niveau de ton switch, qui ne reparti pas bien, selon la valeur de l'extension de ton fichier, ce qui fait qu'il utilise toujours la valeur par défaut (donc "application/octet-stream"), ce qui n'est surement pas compatible avec un fichier PDF.

    Essaye de remplacer ton default
    default: $type = "application/octet-stream"; break;

    par
    default: $type = "application/pdf"; break;


    et regarde si, cette fois, les fichiers PDF se téléchargent bien.

    Si oui, il va falloir trouver un autre façon de choisir le type selon l'extension.

    Si non... ben on verra après, ça ^^'

    1. Bonjour,
      je ne comprends pas ton script
      tu as 2 header !
      avant et apres le case, cela ne peut pas marcher !

      <?php
      $Fichier_a_telecharger = $_GET['file'];
      $chemin = $_GET['chemin'] ;
      
      switch(strrchr(basename($Fichier_a_telecharger), ".")) {
      
      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;
      default: $type = "application/octet-stream"; break;
      
      }
      
      header("Content-disposition: attachment; filename=".$Fichier_a_telecharger);
      
      //correspond a ton type de fichier
      header("Content-Type: ".$type); 
      
      // dessous tu mets binaire ou ascii
      header("Content-Transfer-Encoding: binary");
      
      header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger));
      header("Pragma: no-cache");
      header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
      header("Expires: 0");
      readfile($chemin . $Fichier_a_telecharger);  
      
      ?>
      


      avec ce script modifie cela devrait marcher