2010-09-10 182 views
2

我想用PHP強制下載純文本文件。PHP文件讀取純文本文件

我有下面的代碼,這是我在網絡上撿到的地方:

if (isset($_REQUEST["file"])) { 
    $file=$_REQUEST["file"]; 
    header("Content-type: application/force-download"); 
    header("Content-Transfer-Encoding: ansi"); 
    header("Content-length: ".filesize($file)); 
    header("Content-disposition: attachment; filename=".basename($file)); 
    echo @fileread("$file"); 
} 
else 
{ 
    echo "No file selected"; 
} 

這似乎是工作正常,但是當文件在Windows中打開記事本,行結束符不保留。任何人都可以提供解決方案(文本文件必須用記事本創建)?

謝謝,豐富

+0

Windows「記事本」不好。使用其他任何東西,例如「寫字板」。記事本總是有這樣的問題。 – hsz 2010-09-10 13:25:18

+0

如果您在記事本中查看而沒有先通過PHP腳本進行下載,您的文件是否顯示正常? – 2010-09-10 13:33:54

+0

對不起,關於代碼 - 它應該讀取二進制不是ansi,我只是亂搞和複製代碼而不改回來。與readfile()的拼寫錯誤一樣。 – Rich 2010-09-10 13:46:30

回答

0

據我所知,記事本在這種情況下刪除這些行結束。

0

readfile(),沒有文件讀取。是的'它不是讀文件,PHP甚至是網絡服務器的問題。它只是unix和Windows純文本格式的區別。

在UNIX它\n而在窗戶是\r\n
您在使用Windows格式

也注意到,你的代碼是高度不安全創建這些文件。讓攻擊者讀取您有任何文件,包括密碼等 至少使其

$file=basename($_REQUEST["file"]); 
+0

公平點,但我們不知道原始文件是否具有unix或Windows格式 – 2010-09-10 13:32:07

+0

謝謝您的關注。我只發佈了一段代碼;當我有腳本工作時,我會擔心安全問題。 – Rich 2010-09-10 13:49:35

0

據我所知,ansi是不是一個有效的內容傳輸編碼。由於您要保留文件內容(並且這些內容可能包含長行和CRLF行結尾),因此您可能需要使用binary

+0

對不起,我搞亂了代碼!它被設置爲二進制。 – Rich 2010-09-10 13:50:06