2010-09-10 138 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