2010-09-14 26 views
0

我怎樣才能下載文件(文本/ PDF /等)使用PHP與彈出,以便用戶選擇保存或打開一個頭的任何文件?該文件存儲在(管理/)下載使用PHP

我用這一點,但它不會工作。下載的文件是空的! 這裏是我的代碼:

//get the filename 
$filename = $_GET['filename']; 

//open the file based in filename and path 
$fp = fopen('admin/'.$filename, 'w') or die("can't open file"); 


header("Content-type: text/pdf"); 
header("Content-Disposition: attachment; filename=file.txt"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");   

//echo file_get_contents($filename); 
exit; 

回答

3
//echo file_get_contents($filename); 

這是真的應該被註釋掉?

編輯:

並使用readfile

爲什麼你能看見什麼,是因爲你沒有顯示頭聲明之後任何事情。

+1

此外,OP應使用['readfile'](http://php.net/readfile),這是更有效。 – deceze 2010-09-14 03:44:38

+0

我刪除了評論,它仍然是空的。其實我一直在使用file_get_contents($ filename);已經有一段時間了,它工作得很好,這就是爲什麼我猜這部分代碼沒有問題。 – anonymous123 2010-09-14 03:49:59

+1

'file_get_contents()'會導致你的腳本死掉,如果被加載的文件大於PHP的'memory_limit'設置(它試圖將整個文件一次性寫入內存)。 'readfile()'通過以小塊順序內部讀取文件並單獨發送它來避免這種情況。 – 2010-09-14 04:00:59

1

嘗試

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

這聽起來像你正在嘗試一件危險的事情。你爲什麼要用戶能夠下載任何文件?你確定你不想讓他們只能下載某個目錄下的文件嗎?通過腳本,他們可以訪問所有的PHP腳本,並可能在服務器中發現安全漏洞。

此外,在註釋掉線,你可以考慮使用較少的內存密集型解決方案替換它

while ($fp !== false && ($file_contents_buffer = fgets($fp, 10000)) !== false) { 
    echo $file_contents_buffer; 
} 
+0

是啊!我的意思是來自管理員/文件夾的任何類型的文件。 – anonymous123 2010-09-14 03:47:32

0

一些問題:

$filename = $_GET['filename']; 
$fp = fopen('admin/'.$filename, 'w') or die("can't open file"); 

如果我使用/page.php?filename=../../../../list_of_secret_passwords什麼?這就是所謂的directory traversal attack,你需要保護反對的東西。此外,您不需要打開文件句柄(寫入訪問不低於),只需使用file_existsis_readable來檢查文件是否存在。

//echo file_get_contents($filename); 

如果這一行被註釋掉,當然什麼也不會發生。你應該首先使用readfile雖然。 file_get_contents將整個文件讀入內存,然後echo它像一個普通的字符串。這非常浪費,並且可能會導致大型文件的腳本崩潰。 readfile文件直接輸出到用戶輸出,使用幾乎沒有額外的內存。

這可能是你真正的問題,但:

/* $fp = fopen(*/ 'admin/'.$filename /* , 'w') or die("can't open file"); */ 
/* echo file_get_contents(*/ $filename /*); */ 

'admin/'.$filename$filename

哪一個呢?

0

我認爲這段代碼可以解決你的問題。

<?php 

    $allowed_files = array('filename1.pdf', 'filename2.pdf'); //list content allowed files 
     $file = $_GET["file"]; 
     if(in_array($file , $allowed_files)) { 
       header("Content-type: text/pdf"); 
       header("Content-Disposition: attachment; filename=file.txt"); 
       header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
        readfile($file); 
         exit; 
     } 

     else die('you do not have permission to download this file'); 
?>