2009-08-02 12 views
11

Ho uno script che prende una chiave da $ _GET ['chiave'], cerca la posizione in un database e usa il file di lettura insieme ad alcune intestazioni per presentare un download per uso. Funziona su Firefox ma non su IE8, non è stato possibile testarlo su un altro IE. Ottengo il seguente errore in IE: "Internet Explorer non può scaricare download.php da www.example.com". Come se stesse cercando di scaricare lo script PHP.Script PHP per scaricare file non funzionante 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

dai un'occhiata a SQL injection e mysql_real_escape_string. Questo pezzo di codice è vulnerabile. – erenon

+0

Oh signore si per favore usa mysql_real_escape_string – AaronLS

+0

Non ne so molto, ma potrebbe avere qualcosa a che fare con l'estensione del file in $ file – AaronLS

risposta

28

Per risolvere l'errore: "Internet Explorer non può scaricare download.php da www.example.com", Aggiungere queste intestazioni allo script:

header("Pragma: ");

header("Cache-Control: ");

Il codice sarà rimuovere il Cache-Control dalle intestazioni che rende il problema di download.

Il codice sopra riportato deve essere aggiunto nella parte superiore del file.

Funziona bene per noi.

+0

Grazie mille per aver salvato la mia vita dagli Alien Bugs provenienti da Planet Mars ... Non ho mai saputo cosa posso fare ma questa tua armatura mi ha aiutato ad uccidere questo BUG MOLTO MOLTO BUG ... Bug è morto ... YAY !! .. Grazie :-) – effkay

+0

Siamo andati in giro per questo problema. ho provato così tante raccomandazioni dai post del blog ecc. Questo è stato quello che l'ha risolto! – BishopZ

3

Sostituire questo:
header("Content-type: application/octet-stream");
con questo:
header("Content-Type: application/force-download");

Secondo questa post, IE normalmente non ascolta le intestazioni, e invece cerca sé quello che si sta inviando.

+0

Ho già provato prima, lo stesso errore, purtroppo, grazie. – Stuart

+1

'application/octet-stream' è il tipo di supporto MIME ufficiale per i dati che si desidera scaricare (vedere RFC 2046). – Gumbo

+0

Mi chiedo come le persone conoscono tutti questi RFC? –

0

Solo un suggerimento, se qualcuno (come me) si trova ad affrontare problemi con immettendo direttamente un FileDownload in barra degli indirizzi utilizzando una richiesta https protetta. C'è un bug di IE che sta causando il download a fallire:

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

unica soluzione sembra essere l'impostazione della cache-headers, secondo l'articolo.

0

Non sostituire mai questo: intestazione ("Content-type: application/octet-stream");

con questo: intestazione ("Content-Type: application/force-download");

"application/octet-stream" è semplicemente il più universale e funziona sulla maggior parte dei browser.

Ho provato a utilizzare "application/zip" in uno dei miei test poiché stavo tecnicamente trattando un file ZIP, ma IE6.0 ha danneggiato il download! Tutto il resto si è comportato normalmente però. Ma sì, dovevo tornare a "application/octet-stream", quindi qualsiasi codice là fuori che tenta di rilevare l'estensione del file e passare ad altri tipi di contenuto specifici per l'estensione sono rischiosi! Stai meglio usando "application/octet-stream" per TUTTI i file binari!

Problemi correlati