2010-10-06 7 views
0

J'ai une fonction pour produire des documents, images, etc:header() dans IE

public function direct($theMimeType, $thePath) 
{ 
    header('Content-type: '.$theMimeType); 
    ob_clean(); // clean output buffer 
    flush(); // flush output buffer 
    readfile($thePath); 
    exit; 
} 

Il fonctionne très bien dans Firefox. Le fichier s'ouvre s'il s'agit de PDF, DOCX ou de tout autre fichier. Cependant, dans IE il se fige et rien ne se montre.

Ce qui pourrait causer cela?

EDIT:

J'ai ajouté quelques autres en-têtes:

public function direct($theMimeType, $thePath) 
{ 
    $aSize = filesize($thePath); 
    $aBegin = 0; 
    $aEnd = $aSize; 
    $aFilename = end(explode('/', $thePath)); 
    $aTime = date('r', filemtime($thePath)); 
    $aContentDisposition = ('application/pdf' === $theMimeType) ? 'inline' : 'atachment'; 
    header('HTTP/1.0 200 OK'); 
    header("Content-Type: $theMimeType"); 
    header('Cache-Control: public, must-revalidate, max-age=0'); 
    header('Pragma: no-cache'); 
    header('Accept-Ranges: bytes'); 
    header('Content-Length:'.($aEnd-$aBegin)); 
    header("Content-Range: bytes $aBegin-$aEnd/$aSize"); 
    header("Content-Disposition: $aContentDisposition; filename=$aFilename"); 
    header("Content-Transfer-Encoding: binary\n"); 
    header("Last-Modified: $aTime"); 
    header('Connection: close'); 
    ob_clean(); // clean output buffer 
    flush(); // flush output buffer 
    readfile($thePath); 
    exit; 
} 

Eh bien, cela fonctionne dans IE maintenant, mais encore il ouvre le fichier beaucoup plus lent que Firefox. Il semble y avoir quelques secondes geler avant que le navigateur IE ouvre le fichier.

+0

Nous avons besoin d'un peu plus d'informations que celles-ci, telles que "Quels autres en-têtes envoyez-vous?" –

+0

Il n'y a pas d'autres en-têtes. J'utilise simplement Content-type. –

+0

@ Baker Baker: Vérifiez ma question mise à jour. J'ai ajouté quelques autres en-têtes. –

Répondre

1

en-têtes de votre script la plupart de ceux qu'il les aders ne sont pas vraiment nécessaires. Je préfère garder les choses simples:

header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past 
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified 
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 
header ('Pragma: public'); 
header ('Content-Type: '.$theMimeType); 
header ('Content-Disposition: '.$aContentDisposition.'; filename="'.$aFilename.'"'); 
header ('Content-Transfer-Encoding: binary'); 
header ('Content-Length: '.$aSize); 

Attention à la \ n à la fin de votre tête-Encoding Content-Transfer.

Le 'Pragma: public' est un workround spécifiquement pour gérer un problème avec les connexions IE et https. L'autre différence clé est $ aFilename entre guillemets.

+0

Ouais, nom de fichier sans guillemets 'probablement confondu Internet Explorer. –

2
  • Faire ce fichier télécharger directement, ne pas utiliser les scripts
  • assurez-vous qu'il fonctionne dans IE
  • dans Firefox, utilisez LiveHTTPHeaders pour regarder ce que les en-têtes envoyé par serveur web
  • dans Firefox, l'utilisation LiveHTTPHeaders de regarder ce que les en-têtes envoyé par votre script
  • faire la même chose que
de serveur web
+0

Eh bien, je ne peux pas télécharger ce fichier directement car il est en dehors de la racine du document accessible sur le Web. –

+0

@Richard s'il vous plaît lire la réponse entière, pas la première ligne seulement –