使用PHP打印出可下载的文本文件

时间:2009-11-09 17:24:09

标签: php file-io header

我的脚本根据传递给它的信息将一组htaccess规则放在一起,并为用户提供一个可下载的文本文件,其中包含打印出来的规则。我们的想法是,管理员填写一些表单信息,单击可下载的链接,获取内部打印规则的文本文件,打开文件,复制规则并将其粘贴到其域的htaccess文件中。

我设法将产生这些规则的脚本放在一起。但是,文本文件似乎忽略了我打印到它的所有换行符。选项卡有效,但换行符不起作用。它必须与我在header()函数调用中使用的编码有关,但我不确定我做错了什么。没有任何谷歌搜索似乎指向我正确的方向。任何意见都将不胜感激。

以下是代码:

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="htaccess.txt"'); 
header('Content-Transfer-Encoding: binary');

$id = addslashes( $_GET['id']);
$location = addslashes( $_GET['location'] ); 
$location = substr($location, strpos($location, '/', 9 ) + 1 ) . ( ( substr( $location, strlen($location) - 1 ) == '/' ) ? '' : '/' );
$regEx = '([0-9a-zA-Z-_]*)';
$lines = array();

for( $x = 0; $x < 10; $x++ ) {
    $line = 'RewriteRule ^' . $location;
    for( $y = 1; $y <= $x; $y++ )
        $line .= $regEx . '/';
    $line .=  '*$' . "\t\t\t\t\t";
    $line .= "http://localhost/redirect.php?ring=$id";
    $line .= ( $x >= 1 ) ? '&link=$1' : '';
    $line .= ( $x > 1 ) ? '&tag' . ( $x - 1 ) . '=$' . $x . ' [NC]' . "\n" : "\n";
    $lines[] = $line;
}

foreach( $lines as $line )
    echo $line;

5 个答案:

答案 0 :(得分:3)

Windows并不总是理解"\n"。 Windows使用"\r\n"作为换行符的默认值。

答案 1 :(得分:0)

尝试使用"\r\n"代替"\n"

Linux: \n
Mac: \r
Win: \n\r

答案 2 :(得分:0)

他们为我工作。你在Windows机器上开发?如果是这样,你可能想要使用\ r \ n或更好的PHP_EOL常量,它与环境无关。

答案 3 :(得分:0)

您是在Windows系统还是unix系统上进行测试?我似乎记得unix系统在文本文件中使用与windows系统不同的行结束字符。

维基百科建议

  

“另一个常见问题是使用   '\ n'使用时进行通信   强制要求的互联网协议   使用ASCII CR + LF作为结束行。   将'\ n'写入文本模式流   在Windows系统上正常工作,   但是在Unix上只产生LF,而且   一些完全不同的东西   奇异的系统。在二进制文件中使用“\ r \ n”   模式稍微好一点,因为它的工作原理   在许多与ASCII兼容的系统上,但是   在一般情况下仍然失败。一   方法是使用二进制模式和   指定的数值   控制序列直接,   “\ X0D \ X0A”。“

http://en.wikipedia.org/wiki/Newline

答案 4 :(得分:0)

现在我对这两个标题感到有些困惑:

Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

通常,八位字节流用于二进制可执行文件。由于内容是纯文本,我在将编码设置为“二进制”时也没有任何意义。

使用\ r \ n作为换行符是安全的,因为它适用于UNIX-derviates以及Microsoft Windows机器。

至于内容类型,我建议您使用“text / plain”。