Я пытаюсь сгенерировать строку в vb.net, которую затем хочу отправить на свой сервер, в файл .php, который должен добавить эту строку в файл .txt. В строке несколько строк. Строка правильно достигает php-файла. Однако при записи в файл .txt php создает лишние пустые строки, чего я не хочу.
Что я хочу в своем .txt файле:
line1
line2
line3
Что я получаю:
line1
line2
line3
Я попытался изменить параметры вызова fopen (добавив b в аргументах, чтобы принудительно использовать двоичный режим), но это не помогло. Я также попытался заменить vbNewLine на "\n" и "\r\n" в коде vb.net для разделения строк в строке, но, к сожалению, это не распознается и записывается в файл .txt, например
line1 \r\n line2 \r\n line3
Вот мой код приложения vb.net:
function sendStringToServer()
Dim stringToSend as String
stringToSend = "line1" & vbNewline
stringToSend &= "line2" & vbNewline
stringToSend &= "line3"
Dim wc As New WebClient
wc.Headers("content-type") = "application/x-www-form-urlencoded"
Dim response As String = wc.UploadString("http://www.example.com/uploaddata.php", "data = " & data)
MessageBox.Show(response)
(Обратите внимание, что ответ правильный, лишних пустых строк нет.) И есть код upploaddata.php:
<?php
if (isset($_POST["data"]))
{
echo($_POST["data"]);
$data=$_POST['data'];
$fp = fopen('data.txt', 'ab');
fwrite($fp, $data);
fclose($fp);
}
else
{
echo "ERROR: No data!";
}
?>
Что я делаю неправильно?
Обновлено: после того, как меня попросили сделать минимальный, полный и проверяемый пример, я вставляю код и результаты:
в приложении vb.net Sub, который отправляет строку в uploaddata.php:
function sendStringToServer()
Dim stringToSend as String
stringToSend = "line1" & vbNewline & "line2" & vbNewline & "line3"
Dim wc As New WebClient
wc.Headers("content-type") = "application/x-www-form-urlencoded"
Dim response As String = wc.UploadString("http://www.example.com/uploaddata.php", "data = " & data)
MessageBox.Show(response)
Все содержимое uploaddata.php:
<?php
if (isset($_POST["data"]))
{
var_dump($_POST['data']);
$data=$_POST['data'];
file_put_contents('data.txt', $data);
}
else
{
echo "ERROR: No data!";
}
?>
Содержимое data.txt после вызова sendStringToServer() в приложении vb.net:
line1
line2
line3
Примечание: не используйте "\r"
и "\n"
в VB.NET; они рассматриваются как буквальные строки. Вместо этого используйте константы vbCr
и vbLf
соответственно.
PHP не напишет ничего, о чем вы его не попросите. Эта строка исходит из вашего кода VB. Попробуйте var_dump($_POST['data'])
вместо echo
. Кроме того, вы можете использовать file_put_contents
для записи в файл с помощью одной строки кода.
miken32, Пробовал var_dump - ответ все равно правильный (пустых строк нет). Я также пробовал file_put_contents - к сожалению, я все еще получаю пустые строки в файле .txt.
Создайте минимальный воспроизводимый пример; включите фактические данные, которые вы отправляете, фактический код и фактический вывод PHP при его запуске.
miken32, Я сделал, как ты сказал (надеюсь, у меня все получилось). Пожалуйста, взгляните на мою правку исходного поста.
Вам не нужно было просто дублировать существующий код. 1) это не тот код VB, который вы использовали ("data = " & data)
2) как выглядит результат var_dump
?
И обратите внимание, что вы добавляете к файлу fopen
. Может попробовать удалить файл и начать сначала. Если это на самом деле код VB, который вы использовали, вы найдете пустой файл.
Несколько предложений, одно из которых, надеюсь, решит вашу проблему. Вместо использования vbNewLine
(кстати, устарел) попробуйте используя vbLf
. Перед их использованием убедитесь, что ваши значения равны подстриженный начальных и конечных пробелов (я предполагаю, что ваш фактический код будет использовать переменные). Также ваша строка должна быть правильно URL закодирован перед отправкой в виде данных POST.
function sendStringToServer()
Dim stringToSend as String
stringToSend = Trim("line1") & vbLf
stringToSend &= Trim("line2") & vbLf
stringToSend &= Trim("line3")
stringToSend = HttpUtility.UrlEncode(stringToSend)
Dim wc As New WebClient
wc.Headers("content-type") = "application/x-www-form-urlencoded"
Dim response As String = wc.UploadString("http://www.example.com/uploaddata.php", "data = " & stringToSend)
MessageBox.Show(response)
Что касается PHP, вы можете упростить свой код с помощью file_put_contents
вместо старой тройки fopen
, fwrite
, fclose
.
<?php
if (isset($_POST["data"])) {
echo($_POST["data"]);
file_put_contents("data.txt", $_POST["data"], FILE_APPEND);
} else {
echo "ERROR: No data!";
}
Большое спасибо, miken32!! Изменение vbNewLine на vbLf исправило это. Я понятия не имею, почему vbNewLine вызвал эту проблему с дополнительной пустой строкой, но с этого момента я обязательно буду использовать vbLf. Большое спасибо!
@JustinasRubinovas: причина, по которой вы видите пустые строки, заключается в том, что независимо от того, что вы просматривали или выводили .txt, символ CR также рассматривался как отдельный разрыв строки. В Windows стандартное окончание строки представляет собой составной символ CR + LF, тогда как в системах Linux/Unix (на которых работает большинство PHP-серверов) используется только LF. Это все еще странно, потому что он должен быть совместим с CR + LF и не должен обрабатывать его как отдельные строки два.
@JustinasRubinovas: TL;DR: Используйте vbLf
(при необходимости), когда вы обмениваетесь строками с системами, отличными от Windows, и используйте Environment.NewLine
при работе только в текущей системе и/или в том же приложении.
Спасибо, Винсент, но почему я не могу использовать vbLf внутри текущей операционной системы/того же приложения?
@JustinasRubinovas: Потому что, как я уже сказал, в Windows окончания строк должны быть как CR + LF. Если вы используете только LF, то такие приложения, как «Блокнот», будут рассматривать его так, как будто есть окончания строк нет, и, таким образом, не отображать новые строки (полная противоположность проблемы, которая у вас есть сейчас). Вот почему вам лучше использовать Environment.NewLine
, если вы не передаете строку во внешнюю службу (например, PHP), потому что Environment.NewLine
адаптируется к текущей системе и использует CR + LF, если работает в Windows, и LF, если работает в Mac OS, Linux и т. д. .
Спасибо за ваш комментарий, Эмма, есть несколько способов написать это, и я попробовал предложенный вами способ, но все равно получаю тот же результат.