Записывать данные, полученные из API, используя JavaScript, для размещения сервера - PullRequest
0 голосов
/ 11 апреля 2019

Редактировать: Обновить - Решение

Итак, я достиг того, что мне нужно было сделать: записать данные в файл на сервере.Я не совсем уверен, как все работает, но кажется, что:

xhttp.send(data);

не отправляет все данные в переменную FormData, а скорее только данные с «ключом» «данные».(Извините, если у меня неправильная терминология.) Итак, я взял свой объект "userData" и применил следующее:

userStringData = JSON.stringify(userData);

Затем я поместил userStringData в переменную FormData следующим образом:

var data = new FormData();
data.append("data" , userStringData);

Затем успешно записывается в файл на сервере.В файле у меня были только userStringData, а не «ключ» «данные».

В моем PHP-файле я также включал новую строку после каждой записи, чтобы данные каждой пользовательской строки были в новой строке:

if(!empty($_POST['data'])){
    $data = $_POST['data'];
    $fname = "users.txt";
    $file = fopen("./AJG_Data/".$fname, 'a');
    fwrite($file, $data);
    fwrite($file, "\r\n");
    fclose($file);

Так что теперь это работает для меня.Спасибо тем, кто предложил совет и помощь.

Редактирование: Обновление:

Цель: записать данные на сервер, используя AJAX и PHP.(При необходимости обратитесь к первоначальному вопросу ниже)

Благодаря комментариям ADyson я добился большого прогресса.Я узнал, что XMHHttprequest - это способ сделать AJAX-запрос к серверу.У меня есть этот код:

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            let successString = `Thank you ${userData.athlete.firstname} you have successfully granted permission to read your data.`
            document.querySelector("#message-0").innerHTML = successString;
        }
    };
    xhttp.open("POST","/path_to_my_php_file/file_write.php", true);
    xhttp.send(data);
}

На стороне сервера у меня есть это в моем php-файле:

<?php

$dir = 'AJG_Data';

// create new directory with 744 permissions if it does not exist yet
// owner will be the user/group the PHP script is run under
if ( !file_exists($dir) ) {
     mkdir ($dir, 0744);
}

file_put_contents ($dir.'/test1.txt', 'Hello File');


if(!empty($_POST['data'])){
    $data = $_POST['data'];
    $fname = "users.txt";
    $file = fopen("./AJG_Data/".$fname, 'w');
    fwrite($file, $data);
    fclose($file);
}
?>

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

Вышеописанное прекрасно работает, если я отправляю простые данные FormData, созданные следующим образом:

var data = new FormData();
data.append("data" , "the_text_you_want_to_save");

Проблема, с которой я сталкиваюсь, заключается в том, что при попытке отправить более сложные данные FormData.Не работаетОн не распознает мои FormData и не может пройти мимо этого оператора if:

if(!empty($_POST['data']))

Я проверил свои FormData, используя этот код:

for (var pair of data.entries()) {
    console.log(pair[0]+ ', ' + pair[1]); 
}

Приведенный выше код возвращаетследующее:

token_type, Bearer
expires_at, 12345678910
expires_in, 1234
refresh_token, 1234567890abcefg...
access_token, 1234567890abcdefg...
athlete[id], 1234567
athlete[username], joe_soap
athelete[resouce_state], 2
athlete[firstname], Joe
...
...
athelete[created_at], 2017,01-03T16:07:37Z
...
...
athlete[profile], https://some.web.address/larg.jpg

Итак, насколько я могу судить, у меня есть хорошие FormData, но на стороне сервера ничего не пишется.

Как я могу это исправить?

Спасибо.

Оригинальный вопрос следует ниже.

Я успешно получил данные из API Strava, используя код JavaScript.У меня есть данные, хранящиеся в переменной как объект JavaScript.Я хочу записать данные в файл на сервере.

Я потратил часы на поиск в Интернете и не могу найти решение.Кажется, что это возможно при использовании ajax или jQuery, но я не могу найти простое пошаговое объяснение того, как это сделать.

Итог: я хочу простой способ записать данные в файл на сервере, используя JavaScript или что-то связанное с JavaScript, которое легко и быстро реализовать.Предполагая, что я могу успешно записать в файл, я позже захочу прочитать из файла.

1 Ответ

0 голосов
/ 12 апреля 2019

Вам понадобится другой файл на бэкэнде, который на самом деле сделает запись. Я возьму на себя PHP. Я бы порекомендовал кодировать данные base64 и хранить их в кодированном виде, чтобы сэкономить время.

Javascript:

if (window.XMLHTTPRequest) {
    var xhttp = new XMLHTTPRequest();
} else {
    var xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        //Process output, get result text with this.responseText, decode base64, and parse JSON
        alert(JSON.parse(window.atob(this.responseText)));
    }
}
xhttp.open("POST", "file-load.php?key=" + window.btoa(JSON.stringify(value)), true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhttp.send();

PHP:

<?php
$key = $_POST['key'];
file_put_contents("storage.txt", $key); //Set file contents

Или, если вы хотите добавить его:

<?php
$key = $_POST['key'];
$current = file_get_contents("storage.txt");
file_put_contents("storage.txt", $current . "\n" . $key);

Чтобы прочитать файл, просто используйте ту же настройку, что и для javascript, но вместо file-load.php используйте file-read.php:

echo file_get_contents("storage.txt");

Используйте onreadystatechange для чтения вывода.

...