2013-06-21 3 views
1

J'ai une fonction PHP qui télécharge différents fichiers après avoir cliqué sur un bouton (Si nous cliquons sur le bouton PDF, il va charger un fichier pdf, si nous cliquons sur le bouton DOC, il va charger un fichier doc). C'est la même fonction pour les deux boutons.IE9 télécharger problème php pdf et d'autres fichiers

Mon problème est lorsque je télécharge un fichier. Si c'est le PDF, IE ouvrira une autre page, et la fermera et me donnera le choix de télécharger le fichier, mais si c'est le DOC, IE ouvrira une autre page, et ne la fermera pas.

Le code est (pour moi) le même, je ne vois aucune différence.

<pre> 
<code> 
    public function lettrecadrageAction() { 

    $nom = $_POST['type']; 
    switch ($nom): 

     case 'Fichier DOC' : 

     $path = "ddl/lettre_de_cadrage.doc"; 
     header('Content-Description: File Transfer'); 
     header("Content-Type: application/force-download"); 
     header("Content-Disposition: attachment; filename=lettre_de_cadrage.doc"); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($path)); 
     ob_clean(); 
     flush(); 
     readfile($path); 
     break; 

     case 'Fichier PDF' : 

     $path = "ddl/lettre_de_cadrage.pdf"; 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/force-download'); 
     header("Content-Disposition: attachment; filename=lettre_de_cadrage.pdf"); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($path)); 
     ob_clean(); 
     flush(); 
     readfile($path); 
     break; 
     endswitch; 
    exit; 
    } 
</code> 
</pre> 

L'action Js cliquez

<pre> 
    <code> 
$('.ldc_dl').click(function() { 
     var f = document.createElement("form"); 
     f.method = "POST"; 
     f.name = "form"; 
     f.target = "_blank"; 
     f.setAttribute('style', 'display: none;'); 
     f.action = "http://" + document.domain + "/Exploitation/lettrecadrage/"; 
     var fHtml = document.createElement("input"); 
     fHtml.type = "text"; 
     fHtml.name = "type"; 
     fHtml.value = $(this).html(); 
     console.log(fHtml); 
     var fSubmit = document.createElement("input"); 
     fSubmit.type = "submit"; 
     f.appendChild(fHtml); 
     f.appendChild(fSubmit); 
     document.body.appendChild(f); 
     f.submit(); 
     document.body.removeChild(f); 

     return true; 
    }) </code> 
</pre> 

Le code HTML pour les boutons

<pre> 
    <code> 
    <div class="tab-pane fade" id="ldc"> 
     <p>La lettre de cadrage est disponible en <button id="ldc_dl_doc" class="btn btn-link ldc_dl" type="button">Fichier DOC</button></p> 
     <p> Ou en <button id="ldc_dl_pdf" class="btn btn-link ldc_dl" type="button">Fichier PDF</button></p> 
    </div> 
    </code> 
</pre> 

(Les boutons sont 'Fichier PDF' et 'Fichier DOC')

Modifier - Solution

Avec l'aide de jbl dans les commentaires, je résolus mon problème, en utilisant une iframe:

var frame = document.createElement("iframe"); 
frame.setAttribute("src", "_blank"); 

et modifier mon en-tête sous forme cible

  f.target = frame; 
+0

Vous devez également montrer le code html (et js) qui déclenche le téléchargement – jbl

+0

donc j'ai fait, grâce à la pointe! – Valinor

+0

bien! Je suppose que votre problème vient de f.target = "_blank"; Je suggère plutôt de poster sur un minuscule iframe sur votre page. Voir par exemple: http://stackoverflow.com/q/168455/1236044 – jbl

Répondre

0

Avec l'aide de jbl dans les commentaires, je résolus mon problème, en utilisant une iframe:

var frame = document.createElement("iframe"); 
frame.setAttribute("src", "_blank");

et modifier ma forme cible

 f.target = frame; 
0

Content-Transfer-Encoding est utilisé dans les messages MIME. Cela n'a aucun sens de l'envoyer via HTTP. En-tête dit le navigateur pour l'enregistrer plutôt que de l'ouvrir dans le navigateur. Ainsi, au lieu de Content-Type: application/force-download je suggère d'utiliser bon type de contenu pour les fichiers PDF et DOC:

Content-Type: application/pdf 
Content-Type: application/vnd.ms-word 
+0

Je remplace par ce que vous avez suggéré, mais il ouvre toujours une page vide qui ne se ferme pas tout seul. – Valinor

Questions connexes