2009-08-02 120 views
11

我有一個腳本,需要從$ _GET ['key']鍵,查找數據庫中的位置,並使用讀取文件和一些標題一起呈現下載使用。這適用於Firefox,但不適用於IE8,無法在另一個IE上測試。在IE中出現以下錯誤:「Internet Explorer無法從www.example.com下載download.php」。就好像它試圖下載PHP腳本一樣。PHP腳本下載在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

看看SQL注入和mysql_real_escape_string。這段代碼很脆弱。 – erenon 2009-08-02 13:46:43

+0

Oh lord yes請使用mysql_real_escape_string – AaronLS 2009-08-02 13:47:59

+0

對此不太瞭解,但它可能與$ file中的文件擴展名有關 – AaronLS 2009-08-02 13:50:27

回答

28

爲了解決這個錯誤: 「Internet Explorer無法從www.example.com下載的download.php」, 這些頭添加到您的腳本:

header("Pragma: ");

header("Cache-Control: ");

代碼將從標題中刪除緩存控制,從而導致下載問題。

上面的代碼應該添加在文件的頂部。

它適用於我們。

3

替換此:
header("Content-type: application/octet-stream");
本:
header("Content-Type: application/force-download");

根據這一post,IE不能正常聽你的頭,而是尋找自己要發送的內容。

0

只是一個提示,如果有人(比如我)面臨的問題,直接進入filedownload進入地址欄使用安全的https請求。有導致此下載失敗一個IE漏洞:

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

唯一的解決方法似乎是根據文章被設置緩存頭。

0

永遠不要替換: header(「Content-type:application/octet-stream」);

with this: header(「Content-Type:application/force-download」);

「application/octet-stream」是最普遍的,適用於大多數瀏覽器。

我試過在我的一個測試中使用「application/zip」,因爲我在技術上處理一個ZIP文件,但IE6.0損壞了下載!其他一切都表現正常。但是,必須切換回「application/octet-stream」,所以任何試圖檢測文件擴展名的代碼,以及切換到特定於擴展名的其他內容類型都是有風險的!對於所有二進制文件,最好使用「application/octet-stream」。