11
votes

Script PHP pour télécharger le fichier ne fonctionne pas dans IE

J'ai un script qui prend une clé à partir de $ _GET ['Key'], lève l'emplacement dans une base de données et utilise le fichier ReadFile avec quelques en-têtes pour présenter un téléchargement pour l'utilisation. Cela fonctionne dans Firefox mais pas IE8, n'a pas été capable de le tester sur un autre IE. Je reçois l'erreur suivante dans IE: "Internet Explorer ne peut pas télécharger Télécharger.php à partir de www.example.com". Comme s'il tente de télécharger le script PHP.

$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 commentaires

Jetez un coup d'œil à SQL Injection et mysql_real_escape_string. Ce code est vulnérable.


Oh Seigneur Oui S'il vous plaît utiliser mysql_real_escape_string


Je ne sais pas grand chose à ce sujet, mais cela peut avoir quelque chose à voir avec l'extension de fichier en $ fichier


Si vous voulez dire sur la variable $ clé, alors oui, je l'utilise déjà, juste pas dans le code ci-dessus.


6 Réponses :


3
votes

Remplacer ceci:
en-tête ("Type de contenu: application / octet-flux");
avec ceci:
Rubrique ("Type de contenu: Application / Force-télécharger");

Selon ce POST , c'est-à-dire Normalement écouter à vos en-têtes, et se rapproche plutôt de ce que vous envoyez.


2 commentaires

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


Application / Octet-Stream est le type de média mime officiel pour les données destinées à être téléchargées (voir RFC 2046).



9
votes

réussi à obtenir ce travail en utilisant le premier exemple de php.net

http://us3.php.net/manual/fr/function.readfile.php xxx


0 commentaires

0
votes

Juste un indice, si quelqu'un (comme moi) est confronté à des problèmes d'entrée directement dans une connexion FileDownload dans la barre d'adresse à l'aide d'une demande HTTPS sécurisée. Il y a un bogue IE qui cause que ce téléchargement échoue:

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

Seule la solution de contournement semble définir les en-têtes de cache en fonction de l'article.


0 commentaires

28
votes

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

en-tête ("pragma:");

en-tête ("Cache-contrôle:");

Le code supprimera la commande cache des en-têtes qui fait le problème de téléchargement.

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

Cela fonctionne bien pour nous.


2 commentaires

Merci à un million de sauver ma vie des bugs extraterrestres provenant de Planet Mars ... Je n'ai jamais su ce que je peux faire mais que votre armure de vôtre m'a aidé à tuer ce très très gros bug ... Bug est mort ... yay! !.. Merci :-)


Nous sommes retournés avec ce problème. Essayé tant de recommandations des poteaux de blogs, etc. C'était celui qui l'a réparé!



0
votes

Ne remplacez jamais ceci: tête ("Type de contenu: application / octet-flux");

avec ceci: Header ("Type de contenu: Application / Force-Download");

"Application / octet-Stream" est simplement le plus universel et fonctionne sur la plupart des navigateurs.

J'ai essayé d'utiliser "Application / Zip" dans l'un de mes tests depuis que je traiterais techniquement un fichier zip, mais IE6.0 corrompt le téléchargement! Tout le reste s'est comporté normalement. Mais oui, devait revenir à "Application / Octet-Stream" de sorte que tout code qui essaie de détecter l'extension de fichier et de passer à d'autres types de contenu spécifiques à l'extension sont risqués! Vous ferez mieux d'utiliser "Application / octet-Stream" pour tous les fichiers binaires!


0 commentaires

1
votes

Définissez l'en-tête de disposition de contenu sur "Pièce jointe", comme (en PHP): où la pièce jointe a été scriptée.

<FilesMatch "\.(txt|pdf|csv|xls|xlsx|xlam|xlsb|xlsm|msg|doc|docx|mpg|jpg|png)">
   Header set Content-Disposition attachment
</FilesMatch>


0 commentaires