9
votes

PHP: Force Fichier Télécharger et c'est à nouveau, encore une fois

Les gens, je sais qu'il y a eu beaucoup de threads sur le fait de forcer la boîte de dialogue de téléchargement à apparaître, mais aucune des solutions n'a encore fonctionné pour moi.

Mon application envoie un courrier au compte de messagerie de l'utilisateur, notifiant que "un autre utilisateur leur a envoyé un message". Ces messages peuvent avoir des liens vers des fichiers Excel. Lorsque l'utilisateur clique sur un lien dans leur fichier Gmail / Yahoo Mail / Outlook sur ce fichier Excel, je souhaite la boîte de dialogue Enregistrer le fichier pour apparaître. P>

Problème: lorsque je cliquez avec le bouton droit de la souris et faites "Enregistrer sous" sur IE, je reçois une boîte de dialogue Enregistrer en tant que boîte de dialogue. Lorsque je clique simplement sur le lien (quels de mes clients feront en sorte que ce ne soit pas informatique), je reçois un message d'erreur IE: "Ie ne peut pas télécharger le fichier ...". Peut être pertinent: sur Gmail où je teste cela, chaque lien est un lien "cible = _blank" (forcé par Google). P>

Tous les autres navigateurs fonctionnent bien dans tous les cas. P>

Voici mes en-têtes (capturés via Fiddler): P>

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


0 commentaires

4 Réponses :


2
votes

Si vous essayez d'obtenir le fichier à télécharger à chaque fois, modifiez le type de contenu en «Application / octet-Stream».

Essayez-le sans la déclaration de pragma.


0 commentaires

15
votes

Ceci vérifiera les versions d'IE et définissez des 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);


4 commentaires

Merci beaucoup. Sauvé ma vie! Et je suis de retour à Sane à nouveau :)


post-chèque et pré-chèque Ne faites pas ce que vous pensez qu'ils font. Vous devriez les sortir.


Support ajouté pour IE 11 et corrigé un bogue dans le code.


L'en-tête ('Type de contenu:'. $ MIME); la ligne enverra réellement "Type de contenu: tableau" "



0
votes

Vos directives de non-cache (varient, expire, pragma) causent le problème.

voir http://blogs.msdn.com/ieInternalals/archive/2009/10/02/internet-explorer-cannot-downloadfover-https-quive-no-cache.aspx < / p>


0 commentaires

6
votes

Il suffit d'utiliser:

header('Content-Disposition: attachment');


0 commentaires