Отправка результатов MyTestXPro методом POST на веб-сервер в Интернет: различия между версиями

Материал из MyTestXPro Wiki Help
Перейти к навигации Перейти к поиску
Строка 14: Строка 14:
 
<pre>
 
<pre>
 
<?php
 
<?php
 +
  //скрипт для приёма результатов от модуля тестирования MyTestXPro методом POST
 +
 
 
   //можно проверить ключ
 
   //можно проверить ключ
   if ($_GET['key'] != '8F480FED-621A-41E1-8CB7-E6D4CC9DB76B') return;
+
   if ($_GET['key'] != '8F480FED-621A-41E1-8CB7-E6D4CC9DB76B') return;  
  //проверка связи
+
 
 +
  //проверка связи
 
   if($_POST['Test'] == 'Test'){  
 
   if($_POST['Test'] == 'Test'){  
 
     echo 'OK';
 
     echo 'OK';
 
     return;
 
     return;
 
   }
 
   }
 +
 
 
   //папка с результатами
 
   //папка с результатами
 
   $file_dir = $_SERVER['DOCUMENT_ROOT'].'/E86D3AB5-2F02-4E8F-8F50-349656C9272E/Results/';
 
   $file_dir = $_SERVER['DOCUMENT_ROOT'].'/E86D3AB5-2F02-4E8F-8F50-349656C9272E/Results/';
 
   //текстовый файл с результатами (в папке с результатами)
 
   //текстовый файл с результатами (в папке с результатами)
 
   $file_name = $file_dir . '1.txt';
 
   $file_name = $file_dir . '1.txt';
 +
 
 +
  $SecretKey = '858374A9-EB92-4DAE-AF9C-C3D917C6E152'; //должен быть такой как в программе (задается в настройках)
 +
  $md5SecretKey = md5($SecretKey);
 +
 
 
   //получаем данные, отправленные методом POST
 
   //получаем данные, отправленные методом POST
 +
 
 +
  $Key0 = $_POST['Key0']; //случайная строка от программы для проверки Key1 и Key2
 +
  $md5Key0 = md5($Key0); 
 +
  $Key1 = $_POST['Key1']; //Key1 - проверка хеша файла теста = md5(md5(файла теста).md5(SecretKey).md5(Key0))
 +
  $Key2 = $_POST['Key2']; //Key2 - проверка хеша UId теста = md5(md5(UId теста).md5(SecretKey).md5(Key0))
 +
 
 +
  $UId = $_POST['UId']; 
 +
 
 +
  $_Key2 = md5(md5($UId).$md5SecretKey.$md5Key0); 
 +
  if ($Key2 != $_Key2) return;
 +
 
 
   $UserName = $_POST['UserName'];
 
   $UserName = $_POST['UserName'];
 
   $UserName = iconv("UTF-8", "Windows-1251", $UserName);
 
   $UserName = iconv("UTF-8", "Windows-1251", $UserName);
 +
  if ($UserName == '') return;
 +
 
 
   $UserGroup = $_POST['UserGroup'];
 
   $UserGroup = $_POST['UserGroup'];
 
   $UserGroup = iconv("UTF-8", "Windows-1251", $UserGroup);   
 
   $UserGroup = iconv("UTF-8", "Windows-1251", $UserGroup);   
 +
 
 
   $Mark = $_POST['Mark'];
 
   $Mark = $_POST['Mark'];
 
   $Mark = iconv("UTF-8", "Windows-1251", $Mark);   
 
   $Mark = iconv("UTF-8", "Windows-1251", $Mark);   
 +
 
   $Result = $_POST['Result'];
 
   $Result = $_POST['Result'];
   $Result = iconv("UTF-8", "Windows-1251", $Result);    
+
   $Result = iconv("UTF-8", "Windows-1251", $Result);  
 +
 
 
   $ip = $_SERVER['REMOTE_ADDR'];
 
   $ip = $_SERVER['REMOTE_ADDR'];
 
   $today = date("d.m.Y H:i:s");   
 
   $today = date("d.m.Y H:i:s");   
 +
 
   //$CSV = $_POST['CSV'];
 
   //$CSV = $_POST['CSV'];
   //$CSV = iconv("UTF-8", "Windows-1251", $CSV);
+
   //$CSV = iconv("UTF-8", "Windows-1251", $CSV);
 +
 
 
   //файл с результатами
 
   //файл с результатами
 
   if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){
 
   if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){
Строка 43: Строка 69:
 
$upload_fn = explode(".", $_FILES['file']['name']);
 
$upload_fn = explode(".", $_FILES['file']['name']);
 
if(empty($upload_fn[1]) || ($upload_fn[1] != 'mtxpr')) return; //проверка расширения    
 
if(empty($upload_fn[1]) || ($upload_fn[1] != 'mtxpr')) return; //проверка расширения    
if($_FILES['file']['size'] > 1000000) return;    //Загружаемый файл превысил допустимое значение ... байт
+
if($_FILES['file']['size'] > 1000000) return;    //Загружаемый файл превысил допустимое значение ... байт
 +
 
 +
    //проверка что файл результатов начинается с MyTestXResult
 +
$handle = fopen($_FILES['file']['tmp_name'], "r");
 +
    $contents = fread($handle, 13);
 +
    fclose($handle);
 +
if ($contents != 'MyTestXResult') return;
 +
 
     $upload_path_files = $_SERVER['DOCUMENT_ROOT'] . '/E86D3AB5-2F02-4E8F-8F50-349656C9272E/Results/';  //путь к файлам
 
     $upload_path_files = $_SERVER['DOCUMENT_ROOT'] . '/E86D3AB5-2F02-4E8F-8F50-349656C9272E/Results/';  //путь к файлам
 
$upload_file_name = time() . '_' . $_FILES['file']['name'];  
 
$upload_file_name = time() . '_' . $_FILES['file']['name'];  
 +
$upload_file_name = str_replace('/', '', $upload_file_name);
 +
$upload_file_name = str_replace('\\', '', $upload_file_name);
 
     $upload_new_file_name = $upload_path_files . $upload_file_name;
 
     $upload_new_file_name = $upload_path_files . $upload_file_name;
 
     //Добавляем файл в каталог (сохраняем файл с результатами)
 
     //Добавляем файл в каталог (сохраняем файл с результатами)
 
     if(!move_uploaded_file($_FILES['file']['tmp_name'], $upload_new_file_name)) $upload_new_file_name = '';
 
     if(!move_uploaded_file($_FILES['file']['tmp_name'], $upload_new_file_name)) $upload_new_file_name = '';
 
   }  
 
   }  
   //теперь сохраним данные в текстовый файл
+
  $_Key1 =  md5(md5_file($upload_new_file_name).$md5SecretKey.$md5Key0);
 +
  if ($Key1 != $_Key1) return; 
 +
 
 +
   //теперь сохраним данные в текстовый файл (можно сделать сохранение в БД)
 +
 
 
   $upload_new_file_name = str_replace($_SERVER['DOCUMENT_ROOT'], '', $upload_new_file_name);
 
   $upload_new_file_name = str_replace($_SERVER['DOCUMENT_ROOT'], '', $upload_new_file_name);
   $upload_size = $_FILES['file']['size'];
+
   $upload_size = $_FILES['file']['size'];
   $str = $today . "\t" . $ip . "\t" . $UserName . "\t" . $UserGroup . "\t" . $Mark . "\t" . $Result . "\t"  
+
 
    . $upload_new_file_name . "\t" . $upload_size . "\r\n";  
+
   $str = $today . "\t" . $ip . "\t" . $UserName . "\t" . $UserGroup . "\t" . $Mark . "\t" . $Result . "\t" . $upload_new_file_name . "\t" . $upload_size . "\r\n";
 +
 
 
   $fd = fopen($file_name, 'a') or die('error');
 
   $fd = fopen($file_name, 'a') or die('error');
   flock($fd,2);
+
   flock($fd,2);
 +
 
 
   fputs($fd,$str);
 
   fputs($fd,$str);
 +
 
   flock($fd,3);
 
   flock($fd,3);
   fclose($fd);   
+
   fclose($fd);  
 +
    
 
   //если все хорошо, отправим обратно ОК
 
   //если все хорошо, отправим обратно ОК
 
   echo 'OK';  
 
   echo 'OK';  

Версия 09:49, 6 марта 2014

Иногда отправлять результаты в модуль Журнал (MyTestServer) нет возможности или не целесообразно. В этом случае можно организовать автоматическую отправку результатов по электронной почте или на web-сервер. Первый способ (по эл. почте) более прост в использовании, но менее удобен. Отправка результатов на веб-сервер требуется наличия веб-сервера, где можно организовать прием, все нужные права доступа и знания по программированию для веб, например на PHP.

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

Но учитывайте, что ориентироваться только на текстовые поля не очень надежно, т.к. данные присылаются так же как и обычной веб-формой. Поэтому в важных случаях обращайте внимание на файл с защ. результатами, который тоже присылается.

Для того чтобы модуль тестирования мог отправлять результаты на веб-сервер необходимо в параметрах теста разрешить данную операцию – Параметры теста → Сохранение и вывод результатов → Отправлять результаты в веб.

Так же необходимо настроить модуль тестирования. В настройках нужно установить переключатель "Разрешить отправлять результаты в web" и указать адрес (URL) страницы, которой будут передаваться результаты. Так же можно задать параметры прокси-сервера (через правку файла настроек). В настройках модуля тестирования и настройках автономного теста данные опции (в этой версии) находятся на вкладке с настройками отправки данных по эл. почте.

И, естественно, у вас должен быть веб-сервер, где вы разместите страницу (скрипт) приема и обработки результатов.

Например, скрипт на PHP для приема и сохранения результатов может выглядеть так:

<?php
  //скрипт для приёма результатов от модуля тестирования MyTestXPro методом POST
  
  //можно проверить ключ
  if ($_GET['key'] != '8F480FED-621A-41E1-8CB7-E6D4CC9DB76B') return; 

  //проверка связи
  if($_POST['Test'] == 'Test'){ 
    echo 'OK';
    return;
  }
  
  //папка с результатами
  $file_dir = $_SERVER['DOCUMENT_ROOT'].'/E86D3AB5-2F02-4E8F-8F50-349656C9272E/Results/';
  //текстовый файл с результатами (в папке с результатами)
  $file_name = $file_dir . '1.txt';
  
  $SecretKey = '858374A9-EB92-4DAE-AF9C-C3D917C6E152'; //должен быть такой как в программе (задается в настройках)
  $md5SecretKey = md5($SecretKey);
  
  //получаем данные, отправленные методом POST
  
  $Key0 = $_POST['Key0']; //случайная строка от программы для проверки Key1 и Key2
  $md5Key0 = md5($Key0);  
  $Key1 = $_POST['Key1']; //Key1 - проверка хеша файла теста = md5(md5(файла теста).md5(SecretKey).md5(Key0))
  $Key2 = $_POST['Key2']; //Key2 - проверка хеша UId теста = md5(md5(UId теста).md5(SecretKey).md5(Key0))
  
  $UId = $_POST['UId'];  
  
  $_Key2 = md5(md5($UId).$md5SecretKey.$md5Key0);  
  if ($Key2 != $_Key2) return;
  
  $UserName = $_POST['UserName'];
  $UserName = iconv("UTF-8", "Windows-1251", $UserName);
  if ($UserName == '') return;
  
  $UserGroup = $_POST['UserGroup'];
  $UserGroup = iconv("UTF-8", "Windows-1251", $UserGroup);  
  
  $Mark = $_POST['Mark'];
  $Mark = iconv("UTF-8", "Windows-1251", $Mark);  

  $Result = $_POST['Result'];
  $Result = iconv("UTF-8", "Windows-1251", $Result);    
  
  $ip = $_SERVER['REMOTE_ADDR'];
  $today = date("d.m.Y H:i:s");  

  //$CSV = $_POST['CSV'];
  //$CSV = iconv("UTF-8", "Windows-1251", $CSV);
  
  //файл с результатами
  if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){
    if($_FILES['file']['error'] != UPLOAD_ERR_OK) return; //проверка, что нет ошибок при загрузке 
	$upload_fn = explode(".", $_FILES['file']['name']);
	if(empty($upload_fn[1]) || ($upload_fn[1] != 'mtxpr')) return; //проверка расширения	  
	if($_FILES['file']['size'] > 1000000) return;    //Загружаемый файл превысил допустимое значение ... байт

    //проверка что файл результатов начинается с MyTestXResult
	$handle = fopen($_FILES['file']['tmp_name'], "r");
    $contents = fread($handle, 13);
    fclose($handle);	
	if ($contents != 'MyTestXResult') return;
	
    $upload_path_files = $_SERVER['DOCUMENT_ROOT'] . '/E86D3AB5-2F02-4E8F-8F50-349656C9272E/Results/';  //путь к файлам
	$upload_file_name = time() . '_' . $_FILES['file']['name']; 
	$upload_file_name = str_replace('/', '', $upload_file_name);
	$upload_file_name = str_replace('\\', '', $upload_file_name);
    $upload_new_file_name = $upload_path_files . $upload_file_name;
    //Добавляем файл в каталог (сохраняем файл с результатами)
    if(!move_uploaded_file($_FILES['file']['tmp_name'], $upload_new_file_name)) $upload_new_file_name = '';	
  } 
  $_Key1 =  md5(md5_file($upload_new_file_name).$md5SecretKey.$md5Key0);
  if ($Key1 != $_Key1) return;  
  
  //теперь сохраним данные в текстовый файл (можно сделать сохранение в БД)
  
  $upload_new_file_name = str_replace($_SERVER['DOCUMENT_ROOT'], '', $upload_new_file_name);
  $upload_size = $_FILES['file']['size'];
  
  $str = $today . "\t" . $ip . "\t" . $UserName . "\t" . $UserGroup . "\t" . $Mark . "\t" . $Result . "\t" . $upload_new_file_name . "\t" . $upload_size . "\r\n";  
  
  $fd = fopen($file_name, 'a') or die('error');
  flock($fd,2);
  
  fputs($fd,$str);

  flock($fd,3);
  fclose($fd); 
  
  //если все хорошо, отправим обратно ОК
  echo 'OK'; 
?>

Данный скрипт сохранит результаты в текстовый файл и сохранить файл с (защищенными) результатами. Данные передаются методом POST, как обычной формой. Кодировка UFT8, в данном примере мы конвертируем текст в кодировку win-1251.

Пример скрипта, который отображает полученные результаты таблицей и дает скачать каждый отдельный результат:

<?php
  echo '<!DOCTYPE HTML>';
  echo '<html>';
  echo ' <head>';
  echo '  <title>Результаты</title>';
  echo '  <meta charset="windows-1251">';
  echo '  <link rel="stylesheet" type="text/css" href="style.css">';
  echo ' </head>';
  echo ' <body>';
    $file_dir = $_SERVER['DOCUMENT_ROOT'].'/E86D3AB5-2F02-4E8F-8F50-349656C9272E/Results/';
  $file_name = $file_dir . '1.txt';
    $f = file($file_name);
  $table = '<table>';
  $table .= '<tr><th>№</th><th>Дата</th><th>IP</th><th>Имя</th><th>Группа</th><th>Оценка</th><th>Результат в % от макс. баллов</th><th>Файл результата</th><th>Размер файла</th><tr>';
  $count_res = count($f);
  for($i=0; $i<$count_res; $i++){
    //$line = iconv('utf-8', 'windows-1251', trim($f[$i]));  
    $line = trim($f[$i]);
    $r = explode("\t", $line);
    $count_col = count($r);
	$tr = '<td>'.strval($i+1).'</td>';
	for($j=0; $j<$count_col; $j++){
	  if($j==$count_col-2) {
	    $url = 'http://'.$_SERVER['HTTP_HOST'].$r[$j];
	    $str = '<a href="'.$url.'">'.basename($r[$j]).'</a>';	
	  }else 
	  $str = $r[$j];
	  $tr .= '<td>'.$str.'</td>';
	}
  	$table .= '<tr>'.$tr.'</tr>';
  } 
  $table .= '<table>';
  echo $table; 
  echo ' </body>';
  echo '</html>';  
?>

Вот пример его работы:

Post web.png

Пример пользовательских скриптов, использующих базы данных, вы можете найти на форуме программы.