Мне нужно создать текстовый файл для загрузки на лету, но я просто не могу избавиться от разрыва строки в начале файла, я пробовал много обрезать, заменяет, но первая строка все еще там, мне это нужно файл, который будет создан без разрывов строк в начале, так как он будет использоваться другим приложением, которое не ожидает переноса строк в начале.
Вот код:
$strfilename = "test.txt";
$testFile = fopen($strfilename, "w") or die("Error!");
//header
$strLine = "test|1\r\n";
$strLine .= "A|1|2|\r\n";
$line_out = preg_replace('/[\n\r]+/', '', $strLine);
$line_out = str_replace(array("\n", "\r"), '', $strLine);
fwrite($testFile, $line_out);
fclose($testFile);
header('Content-Description: File Transfer');
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename='.basename($strfilename));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($testFile));
readfile($strfilename);
exit;
Например, при открытии файла с помощью блокнота первой строки там нет:
1 - test|1
2 - A|1|2|
Но если вы откроете его с помощью расширенного текстового редактора (например, Notepad ++), вы увидите разрыв строки в начале:
1 -
2 - test|1
3 - A|1|2|
Попробуйте код ниже.
$strfilename = "test.txt";
$testFile = '';
//header
$strLine = "test|1\r\n";
$strLine .= "A|1|2|\r\n";
$line_out = str_replace(array("\n", "\r"), '', $strLine);
$testFile .= $line_out;
file_put_contents(trim($strfilename));
header('Content-Description: File Transfer');
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename='.basename($strfilename));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($testFile));
readfile($strfilename);
exit;
сломать это
$testFile = file_get_contents($strfilename);
получает все содержимое файла в строку, это можно опустить и используя $testFile = '';
вполне достаточно для остальной части кода — если файл пуст.
$testFile .= $line_out;
помещает ваш текст в переменную $ testFile
file_put_contents(trim($strfilename));
это записывает файл, очищает все разрывы строк в начале или конце.
$line_out = preg_replace('/[\n\r]+/', '', $strLine);
удаляется как ненужно
В вашем собственном коде, ваш файл $strfilename
в нем уже есть разрыв строки, и когда вы открываете его, вы получаете файл, не меняя того, что он имеет, следовательно, перенос строки в начале. И вы пишете немного и закрываете файл, не удаляя первый разрыв строки. Это не будет какая разница, если вы обрезаете $line_out
как разрыв строки находится в файле.
Попробуйте этот код:
<?php
$strfilename = "test.txt";
$testFile = fopen($strfilename, "w") or die("Error!");
//header
$strLine = "test|1\r\n";
$strLine .= "A|1|2|\r\n";
$line_out = preg_replace('/[\r]+/', '', $strLine);
$line_out = str_replace(array("\r"), "", $strLine);
$line_out = trim($line_out);
fwrite($testFile, $line_out);
fclose($testFile);
header('Content-Description: File Transfer');
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename='.basename($strfilename));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($strfilename));
readfile($strfilename);
exit;