2009-08-02 4 views
11

J'ai un script qui prend une clé de $ _GET ['clé'], recherche l'emplacement dans une base de données et utilise le fichier readfile avec certains en-têtes pour présenter un téléchargement pour le utilisation. Cela fonctionne dans Firefox mais pas IE8, n'ont pas été en mesure de le tester sur un autre IE. J'obtiens l'erreur suivante dans IE: "Internet Explorer ne peut pas télécharger download.php depuis www.example.com". Comme s'il essayait de télécharger le script PHP.Script PHP pour télécharger le fichier ne fonctionne pas dans IE


$the_query = "SELECT * FROM `files` WHERE `user_id`=" . $_SESSION['user_id'] . " AND `key`='" . $key . "'"; 

$result = mysql_query($the_query); 
$row = mysql_fetch_array($result); 

$file = '/var/www/vhosts/www.example.com/httpsdocs/uploads/' . $row['id'] . '/' . $row['file']; 

header("Content-type: application/octet-stream"); 
header("Content-length: ".filesize($file)); 
header('Content-Description: File Transfer'); 
header("Cache-control: private"); 
header('Content-Disposition: attachment; filename=' . rawurlencode(basename($file))); 
readfile($file); 
+4

jetez un oeil à l'injection SQL et mysql_real_escape_string. Ce morceau de code est vulnérable. – erenon

+0

Oh seigneur oui s'il vous plaît utiliser mysql_real_escape_string – AaronLS

+0

Ne sait pas beaucoup à ce sujet, mais il peut avoir quelque chose à voir avec l'extension de fichier dans le fichier $ – AaronLS

Répondre

28

Pour résoudre l'erreur: "Internet Explorer ne peut pas télécharger download.php de www.example.com", Ajouter ces têtes à votre script:

header("Pragma: ");

header("Cache-Control: ");

Le code supprimer le Cache-Control des en-têtes ce qui rend le problème de téléchargement.

Le code ci-dessus doit être ajouté en haut du fichier.

Cela fonctionne très bien pour nous.

+0

Merci un million pour m'avoir sauvé la vie d'Alien Bugs venant de Planet Mars ... Je n'ai jamais su ce que je pouvais faire mais ton armure à toi m'a aidé à tuer ce TRÈS TRÈS GROS BUG ... Le bug est mort ... YAY !! .. Merci :-) – effkay

+0

Nous avons fait le tour de ce problème. essayé tant de recommandations de blogs, etc Ce fut celui qui l'a réparé! – BishopZ

3

Remplacer ceci:
header("Content-type: application/octet-stream");
avec ceci:
header("Content-Type: application/force-download");

Selon cette post, IE n'écouter normalement à vos têtes, et regarde plutôt pour lui-même ce que vous envoyez.

+0

J'ai déjà essayé cela avant, même erreur malheureusement, merci. – Stuart

+1

'application/octet-stream' est le type de média officiel MIME pour les données qui sont destinées à être téléchargées (voir RFC 2046). – Gumbo

+0

Je me demande comment les gens connaissent tous ces RFC? –

0

Juste un soupçon, si quelqu'un (comme moi) fait face à des problèmes de saisie directe FileDownload dans la barre d'adresse à l'aide d'une requête https sécurisée. Il y a un bug IE qui est l'origine de ce téléchargement à l'échec:

http://support.microsoft.com/kb/323308/en-us

solution de contournement semble mettre le cache-têtes selon l'article.

0

Ne remplacez jamais ceci: header ("Content-type: application/octet-stream");

avec ceci: header ("Content-Type: application/force-download"); "Application/octet-stream" est tout simplement le plus universel et fonctionne sur la plupart des navigateurs.

J'ai essayé d'utiliser "application/zip" dans l'un de mes tests puisque je traitais techniquement un fichier ZIP, mais IE6.0 corrompu le téléchargement! Tout le reste se comportait normalement bien. Mais oui, a dû revenir à "application/octet-stream" donc tout code qui essaie de détecter l'extension de fichier et passer à d'autres types de contenu spécifiques à l'extension sont risqués! Il vaut mieux utiliser "application/octet-stream" pour TOUS les fichiers binaires!

Questions connexes