Использование PHP для распечатки загружаемого текстового файла - PullRequest
0 голосов
/ 09 ноября 2009

Мой скрипт собирает набор правил htaccess на основе переданной в него информации и предоставляет пользователю загружаемый текстовый файл с распечатанными правилами. Идея заключается в том, что администратор заполняет некоторую информацию о форме, щелкает ссылку для загрузки, получает текстовый файл с распечатанными правилами, открывает файл, копирует правила и вставляет их в файл htaccess своего домена.

Мне удалось собрать сценарий, который создает эти правила. Однако текстовый файл, кажется, игнорирует все символы новой строки, которые я печатаю на нем. Вкладки работают, а новые строки - нет. Это должно быть как-то связано с кодировкой, которую я использую с вызовами функций header (), но я не уверен, что делаю неправильно. Никакое количество Google, как мне показалось, не указывало мне правильное направление. Любой вклад будет оценен.

Вот код:

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 ]

3 голосов
/ 09 ноября 2009

Windows не всегда понимает "\n". Windows использует "\r\n" по умолчанию для разрывов строк.

0 голосов
/ 09 ноября 2009

Сейчас я немного озадачен этими двумя заголовками:

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

Как правило, поток октетов используется для двоичных исполняемых файлов. Поскольку содержимое представляет собой простой текст, я также не вижу никакого смысла устанавливать кодировку как «двоичную».

Безопасно использовать \ r \ n для разрыва строки, так как он работает как на UNIX-дериватах, так и на машинах с Microsoft Windows.

Что касается типа контента, я бы порекомендовал в вашем случае "text / plain".

0 голосов
/ 09 ноября 2009

Вы тестируете в системе Windows или Unix? Кажется, я помню, что Unix-системы используют в текстовых файлах символы конца строки, чем Windows-системы.

Википедия предлагает

"Другая распространенная проблема - это использование '\ n' при общении с использованием Интернет-протокол, который обязывает использование ASCII CR + LF для окончания строк. Запись '\ n' в поток текстового режима корректно работает в системах Windows, но выдает только LF на Unix, и что-то совершенно другое на более экзотические системы. Использование "\ r \ n" в двоичном режим немного лучше, так как работает на многих ASCII-совместимых системах, но все еще терпит неудачу в общем случае. Один подход заключается в использовании двоичного режима и указать числовые значения последовательность управления напрямую, "\ X0D \ x0A". "

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

0 голосов
/ 09 ноября 2009

Они работают на меня. Вы разрабатываете на машине Windows? Если это так, вы можете использовать \ r \ n или еще лучше, константу PHP_EOL, которая не зависит от среды.

0 голосов
/ 09 ноября 2009

Попробуйте поставить "\r\n" вместо "\n"

Linux: \n
Mac: \r
Win: \n\r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...