2009-10-20 8 views
8

Folks, je sais qu'il y a eu beaucoup de discussions sur le fait de forcer la boîte de dialogue de téléchargement pour apparaître, mais aucune des solutions n'a fonctionné pour moi pour le moment.PHP: Forcer le téléchargement de fichiers et IE, encore une fois

Mon application envoie un courrier électronique au compte de messagerie de l'utilisateur, en lui notifiant qu'un "autre utilisateur lui a envoyé un message". Ces messages peuvent contenir des liens vers des fichiers Excel. Lorsque l'utilisateur clique sur un lien dans son GMail/Yahoo Mail/Outlook vers ce fichier Excel, je veux que la boîte de dialogue File Save apparaisse. Problème: lorsque je clique avec le bouton droit et que je fais "Enregistrer sous" sur IE, j'obtiens une boîte de dialogue Enregistrer sous. Lorsque je clique sur le lien (que beaucoup de mes clients vont faire car ils ne sont pas à l'aise avec l'informatique), je reçois un message d'erreur IE: "IE ne peut pas télécharger le fichier ... à partir de ...". Peut être pertinent: sur GMail où je teste ceci, chaque lien est un lien "target = _blank" (forcé par Google).

Tous les autres navigateurs fonctionnent correctement dans tous les cas.

Voici mes en-têtes (capturés par Fiddler):

HTTP/1.1 200 OK 
Proxy-Connection: Keep-Alive 
Connection: Keep-Alive 
Content-Length: 15872 
Via: **** // proxy server name 
Expires: 0 
Date: Tue, 20 Oct 2009 22:41:37 GMT 
Content-Type: application/vnd.ms-excel 
Server: Apache/2.2.11 (Unix) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i mod_python/3.3.1 Python/2.5.2 SVN/1.4.6 mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0 
Cache-Control: private 
Pragma: no-cache 
Last-Modified: Tue, 20 Oct 2009 22:41:37 GMT 
Content-Disposition: attachment; filename="myFile.xls" 
Vary: Accept-Encoding 
Keep-Alive: timeout=5, max=100 

Je veux un comportement régulier clic gauche de IE pour fonctionner. Des idées?

Répondre

13

Ceci vérifie les versions de IE et définit les en-têtes en conséquence.

// assume you have a full path to file stored in $filename 
if (!is_file($filename)) { 
    die('The file appears to be invalid.'); 
} 

$filepath = str_replace('\\', '/', realpath($filename)); 
$filesize = filesize($filepath); 
$filename = substr(strrchr('/'.$filepath, '/'), 1); 
$extension = strtolower(substr(strrchr($filepath, '.'), 1)); 

// use this unless you want to find the mime type based on extension 
$mime = array('application/octet-stream'); 

header('Content-Type: '.$mime); 
header('Content-Disposition: attachment; filename="'.$filename.'"'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: '.sprintf('%d', $filesize)); 
header('Expires: 0'); 

// check for IE only headers 
if (preg_match('~MSIE|Internet Explorer~i', $_SERVER['HTTP_USER_AGENT']) || (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident/7.0; rv:11.0') !== false)) { 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
} else { 
    header('Pragma: no-cache'); 
} 

$handle = fopen($filepath, 'rb'); 
fpassthru($handle); 
fclose($handle); 
+0

Merci beaucoup SOOO. Sauvé ma vie! Et je suis de nouveau sain d'esprit :) –

+1

après vérification et pré-vérifier ne faites pas ce que vous pensez qu'ils font. Vous devriez les sortir. – EricLaw

+0

Ajout du support pour IE 11 et correction d'un bug dans le code. –

2

Si vous essayez de télécharger le fichier à chaque fois, changez le type de contenu en 'application/octet-stream'. Essayez-le sans l'instruction pragma.

5

utiliser Just:

header('Content-Disposition: attachment'); 

C'est tout. (Facebook fait la même chose.)

Questions connexes