2009-08-02 10 views
11

Ich habe ein Skript, das einen Schlüssel aus $ _GET ['key'], sucht den Speicherort in einer Datenbank und verwendet die Readfile zusammen mit einigen Überschriften, um einen Download für die benutzen. Dies funktioniert in Firefox aber nicht IE8, war nicht in der Lage, es auf einem anderen IE zu testen. Ich bekomme den folgenden Fehler im IE: "Internet Explorer kann download.php nicht von www.example.com herunterladen". Als ob es versucht, das PHP-Skript herunterzuladen.PHP Skript zum Download Datei funktioniert nicht in 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

werfen Sie einen Blick auf SQL-Injektion und mysql_real_escape_string. Dieser Code ist anfällig. – erenon

+0

Oh mein Gott ja bitte benutze mysql_real_escape_string – AaronLS

+0

Ich weiß nicht viel darüber, aber es kann etwas mit der Dateierweiterung in $ file zu tun haben – AaronLS

Antwort

28

Um den Fehler zu beheben: "Internet Explorer von www.example.com herunterladen können nicht download.php", Fügen Sie diese Header zu Ihrem Skript:

header("Pragma: ");

header("Cache-Control: ");

Der Code wird Entfernen Sie das Cache-Control von den Headern, was das Download-Problem verursacht.

Der obige Code sollte am Anfang der Datei hinzugefügt werden.

Es funktioniert gut für uns.

+0

Dank eine Million für die Rettung meines Lebens von Alien Bugs vom Planeten Mars ... Ich wusste nie, was ich tun kann aber deine Rüstung von mir hat mir geholfen, diesen SEHR SEHR GROSSEN BUG zu töten ... Der Bug ist tot ... YAY !! .. Danke :-) – effkay

+0

Wir sind mit diesem Problem hin und her gerannt. Ich habe so viele Empfehlungen von Blog-Posts ausprobiert. Das war der, der es repariert hat! – BishopZ

3

diese ersetzen:
header("Content-type: application/octet-stream");
mit diesem:
header("Content-Type: application/force-download");

Nach dieser post, wird also in der Regel nicht auf Ihre Header hören und sieht stattdessen für sich selbst, was Sie senden.

+0

habe ich das schon mal probiert, selbe fehler leider, danke. – Stuart

+1

'application/octet-stream' ist der offizielle MIME-Medientyp für Daten, die heruntergeladen werden sollen (siehe RFC 2046). – Gumbo

+0

Ich frage mich, wie die Leute all diese RFCs kennen? –

0

Nur ein Hinweis, wenn jemand (wie mich) ist mit Problemen konfrontiert, mit direkt ein Filedownload in der Eingabe Adressleiste mit einer gesicherten https-Anfrage. Es ist ein Fehler, den IE dieses Download verursacht scheitern:

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

einzige Lösung scheint nach dem Cache-Header Einstellung zu dem Artikel.

0

Niemals ersetzen: header ("Content-type: application/octet-stream");

mit diesem: header ("Content-Type: application/force-download");

"application/octet-stream" ist einfach das universellste und funktioniert auf den meisten Browsern.

Ich habe versucht, "Anwendung/Zip" in einem meiner Tests, da ich technisch mit einer ZIP-Datei beschäftigt war, aber IE6.0 beschädigt den Download! Alles andere verhielt sich normal. Aber yeah, musste zurück zu "application/octet-stream" wechseln, also ist jeder Code, der versucht, die Dateiendung zu erkennen und zu anderen, für die Erweiterung spezifischen Inhaltstypen zu wechseln, riskant! Du solltest besser "application/octet-stream" für ALLE Binärdateien verwenden!

Verwandte Themen