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
4 Réponses :
Si vous essayez d'obtenir le fichier à télécharger à chaque fois, modifiez le type de contenu en «Application / octet-Stream». P>
Essayez-le sans la déclaration de pragma. P>
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);
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); code> la ligne enverra réellement "Type de contenu: tableau" "
Vos directives de non-cache (varient, expire, pragma) causent le problème. P>
Il suffit d'utiliser:
header('Content-Disposition: attachment');