Передача данных из filepicker в CGI скрипт, обработка и получение результата обратно в php.

Передача данных из filepicker в CGI скрипт, обработка и получение результата обратно в php.

от Станислав Швец -
Количество ответов: 5
Я хочу передать текст, полученный из filepicker(только .txt), обработать его, получить данные обратно, и вывести (echo) на страницу.
Я выполнил var_dump($content); Так что это точно строка:

string(828) "..........my text here............"

Ещё я точно знаю, что мой CGI скрипт работает, если я вручную буду вводить данные: 

http://localhost/speciallocation/local/tokenize/morgot.py?someamountoftext=Enter your text here

Вывод: ['Enter', 'your', 'text', 'here']

Но, когда я нажимаю на кнопку submit, выводится только название моего файла, ввиду того, что я не отсылал его на обработку в CGI, а просто вывел его echo'м. Если просто вывести echo'м содержимое файла, это также даст результат.

Это наводит меня на мысль, что проблема где-то в части отправить\принять данные.....

Какие-нибудь мысли, народ?

Мой php код:

<?php

require_once(DIR . '/../../config.php');
require_once($CFG->dirroot . '/local/tokenize/classes/forms/tokenization.php');
$PAGE->set_url(new moodle_url('/local/tokenize/tokenization.php'));
$PAGE->set_context(\context_system::instance());
$PAGE->set_title(get_string('TOKENIZATOR', 'local_tokenize'));

$mform= new tokenization();
echo $OUTPUT->header();
  
if ($mform->is_cancelled()) {
    //Handle form cancel operation, if cancel button is present on form
} else if ($fromform = $mform->get_data()) {
  //In this case you process validated data. $mform->get_data() returns data posted in form.
  
  $name = $mform->get_new_filename('userfile');
  echo $name. '<br>';
 $content = $mform->get_file_content('userfile');
 //echo $content;
 var_dump($content);
 
  $morgot_link = "http://localhost/diplom/local/tokenize/morgot.py?someamountoftext=" . $content;
  $morgot_data = file_get_contents($morgot_link);
  echo $morgot_data;
  
} else {
  // this branch is executed if the form is submitted but the data doesn't validate and the form should be redisplayed
  // or on the first display of the form.

  //displays the form
  $mform->display();
}

echo $OUTPUT->footer();

Мой python CGI код:

#!C:\Users\HP\AppData\Local\Programs\Python\Python310-32\python.exe


import os
import urllib.parse
import nltk

query_dict = urllib.parse.parse_qs(os.environ['QUERY_STRING'])
input_something = str(query_dict['someamountoftext'])[2: -2]
def tknz_wrd(someamountoftext):
    return(nltk.word_tokenize(someamountoftext))


print("Content-Type: text/html\n")

print (tknz_wrd(input_something))

morgot.py - Имя моего CGI python файла.

Дополнение: Я проверил ставится ли содержимое фала($content) в $morgot_link:

$morgot_link = "http://localhost/diplom/local/tokenize/morgot.py?someamountoftext=" . $content;
  echo $morgot_link;

Да, вывод верный:

http://localhost/diplom/local/tokenize/morgot.py?someamountoftext=...........many text here.............

Это тем более наводит на мысль, что проблема в части "получить данные"($morgot_data = file_get_contents($morgot_link); 

Также я не отрицаю, что могут быть какие-то ограничения\разрешения в Moodle на получение  данных извне.



                        
В ответ на Станислав Швец

Re: Передача данных из filepicker в CGI скрипт, обработка и получение результата обратно в php.

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода

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

В вашем случае правильнее использовать curl. 

https://www.php.net/manual/ru/curl.examples-basic.php


В ответ на Vadim Dvorovenko

Re: Передача данных из filepicker в CGI скрипт, обработка и получение результата обратно в php.

от Станислав Швец -
Здравствуйте. Благодарю, что дали хоть какую-то наводку. Я проверил что там с allow_url_fopen в php.ini из XAMPP. Изначально стояло = On Что странно.
Насчёт Curl мне трудно сказать, учитывая отсутствие опыта работы с этим, но я попробовал заменить $morgot_data = file_get_contents($morgot_link);

следующим кодом:

$url = $morgot_link;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_PORT , 80);
curl_setopt ($ch, CURLOPT_TIMEOUT , 300);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

Не помогло. Всё так же пусто. Ну а по поводу безопасности http - не имеет значения. Лишь бы заработало. А как - дело десятое.
В ответ на Станислав Швец

Re: Передача данных из filepicker в CGI скрипт, обработка и получение результата обратно в php.

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
Отдавать файл через QUERY_STRING - плохая идея. Для этих целей используется метод POST.

$postfields = array('data'=>"длинный текст");
$url="http://localhost/...";
$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$result = curl_exec($ch);
В ответ на Виталий Лавров

Re: Передача данных из filepicker в CGI скрипт, обработка и получение результата обратно в php.

от Станислав Швец -
Благодарю и Вас за желание помочь. Попробовал ваш способ - Увы, неутешительно. Данный код:
$url="http://localhost/diplom/local/tokenize/morgot.py?someamountoftext=";
........
echo $result;
Выводит на страницу сообщение об ошибке "Internal Server Error" - скорее всего от CGI скрипта. Причём выводится это дело именно как echo, не затрагивая ничего другого.
Я также попробовал сделать так:
$postfields = $content;
Но это вообще ничего не вывело.
В ответ на Станислав Швец

Re: Передача данных из filepicker в CGI скрипт, обработка и получение результата обратно в php.

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
"Internal Server Error" - это сказал веб-сервер когда ваш скрипт завершился аварийно. Причина в логах.
Научитесь читать логи веб-сервера - это существенно упростит диагностику ошибок.
Нет смысла отлаживать эту поделку на питоне через moodle. Научитесь выполнять такие запросы из командной строки при помощи wget/curl.
Это существенно сократит время отладки. Там сразу видно что вы получили в ответ от своего скрипта.
Для питона как минимум есть модуль cgi, который позволяет получать данные из формы нормальным способом, а не как у вас.

Конструкция "$morgot_link = "http://localhost/diplom/local/tokenize/morgot.py?someamountoftext=" . $content;" во многих случаях не будет работать. Читайте про кодирование параметров.