Открытие файла .txt с помощью fopen создает дополнительные пустые строки

Я пытаюсь сгенерировать строку в 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

Спасибо за ваш комментарий, Эмма, есть несколько способов написать это, и я попробовал предложенный вами способ, но все равно получаю тот же результат.

Justinas Rubinovas 06.04.2019 23:35

Примечание: не используйте "\r" и "\n" в VB.NET; они рассматриваются как буквальные строки. Вместо этого используйте константы vbCr и vbLf соответственно.

41686d6564 06.04.2019 23:39

PHP не напишет ничего, о чем вы его не попросите. Эта строка исходит из вашего кода VB. Попробуйте var_dump($_POST['data']) вместо echo. Кроме того, вы можете использовать file_put_contents для записи в файл с помощью одной строки кода.

miken32 07.04.2019 00:15

miken32, Пробовал var_dump - ответ все равно правильный (пустых строк нет). Я также пробовал file_put_contents - к сожалению, я все еще получаю пустые строки в файле .txt.

Justinas Rubinovas 07.04.2019 00:24

Создайте минимальный воспроизводимый пример; включите фактические данные, которые вы отправляете, фактический код и фактический вывод PHP при его запуске.

miken32 07.04.2019 00:26

miken32, Я сделал, как ты сказал (надеюсь, у меня все получилось). Пожалуйста, взгляните на мою правку исходного поста.

Justinas Rubinovas 07.04.2019 00:36

Вам не нужно было просто дублировать существующий код. 1) это не тот код VB, который вы использовали ("data = " & data) 2) как выглядит результат var_dump?

miken32 07.04.2019 00:37

И обратите внимание, что вы добавляете к файлу fopen. Может попробовать удалить файл и начать сначала. Если это на самом деле код VB, который вы использовали, вы найдете пустой файл.

miken32 07.04.2019 00:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
8
610
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несколько предложений, одно из которых, надеюсь, решит вашу проблему. Вместо использования 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. Большое спасибо!

Justinas Rubinovas 07.04.2019 00:40

@JustinasRubinovas: причина, по которой вы видите пустые строки, заключается в том, что независимо от того, что вы просматривали или выводили .txt, символ CR также рассматривался как отдельный разрыв строки. В Windows стандартное окончание строки представляет собой составной символ CR + LF, тогда как в системах Linux/Unix (на которых работает большинство PHP-серверов) используется только LF. Это все еще странно, потому что он должен быть совместим с CR + LF и не должен обрабатывать его как отдельные строки два.

Visual Vincent 07.04.2019 11:53

@JustinasRubinovas: TL;DR: Используйте vbLf (при необходимости), когда вы обмениваетесь строками с системами, отличными от Windows, и используйте Environment.NewLine при работе только в текущей системе и/или в том же приложении.

Visual Vincent 07.04.2019 11:57

Спасибо, Винсент, но почему я не могу использовать vbLf внутри текущей операционной системы/того же приложения?

Justinas Rubinovas 07.04.2019 13:26

@JustinasRubinovas: Потому что, как я уже сказал, в Windows окончания строк должны быть как CR + LF. Если вы используете только LF, то такие приложения, как «Блокнот», будут рассматривать его так, как будто есть окончания строк нет, и, таким образом, не отображать новые строки (полная противоположность проблемы, которая у вас есть сейчас). Вот почему вам лучше использовать Environment.NewLine, если вы не передаете строку во внешнюю службу (например, PHP), потому что Environment.NewLine адаптируется к текущей системе и использует CR + LF, если работает в Windows, и LF, если работает в Mac OS, Linux и т. д. .

Visual Vincent 07.04.2019 22:02

Другие вопросы по теме

Похожие вопросы