Отправка результатов MyTestXPro методом POST на веб-сервер в Интернет: различия между версиями
Bas (обсуждение | вклад) |
Bas (обсуждение | вклад) |
||
Строка 14: | Строка 14: | ||
<pre> | <pre> | ||
<?php | <?php | ||
+ | # MyTestXPro http://mytest.klyaksa.net | ||
# скрипт для приёма и сохранения результатов тестирования от модуля тестирования или автономного теста MyTestXPro методом POST | # скрипт для приёма и сохранения результатов тестирования от модуля тестирования или автономного теста MyTestXPro методом POST | ||
− | # в настройках программы в "настройки POST" адрес | + | # в настройках программы MyTestXPro (точнее в модуле тестирования) в "настройки POST" адрес указываем типа |
− | # http://ВАШ-САЙТ/ | + | # http://ВАШ-САЙТ/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/SaveResult.php?key=8F480FED-621A-41E1-8CB7-E6D4CC9DB76B |
+ | |||
+ | //print_r($_POST); | ||
//можно проверить ключ (произвольная переменная (метод GET) в адресе скрипта) | //можно проверить ключ (произвольная переменная (метод GET) в адресе скрипта) | ||
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'){ | ||
Строка 32: | Строка 35: | ||
$file_name = $file_dir . 'data.txt'; | $file_name = $file_dir . 'data.txt'; | ||
//папка для файлов результатов *.mtxpr (можно задать проще, например, $_SERVER['DOCUMENT_ROOT'].'/MyTestXProResults/Data/') | //папка для файлов результатов *.mtxpr (можно задать проще, например, $_SERVER['DOCUMENT_ROOT'].'/MyTestXProResults/Data/') | ||
− | $upload_path_files = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/'; | + | $upload_path_files = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/'; |
− | + | ||
$SecretKey = '858374A9-EB92-4DAE-AF9C-C3D917C6E152'; //должен быть такой как в программе (задается в настройках, для защиты необходимо указать изменить) | $SecretKey = '858374A9-EB92-4DAE-AF9C-C3D917C6E152'; //должен быть такой как в программе (задается в настройках, для защиты необходимо указать изменить) | ||
$md5SecretKey = md5($SecretKey); | $md5SecretKey = md5($SecretKey); | ||
Строка 43: | Строка 46: | ||
$Key1 = $_POST['Key1']; //Key1 - проверка хеша файла теста = md5(md5(файла теста).md5(SecretKey).md5(Key0)) | $Key1 = $_POST['Key1']; //Key1 - проверка хеша файла теста = md5(md5(файла теста).md5(SecretKey).md5(Key0)) | ||
$Key2 = $_POST['Key2']; //Key2 - проверка хеша UId теста = md5(md5(UId теста).md5(SecretKey).md5(Key0)) | $Key2 = $_POST['Key2']; //Key2 - проверка хеша UId теста = md5(md5(UId теста).md5(SecretKey).md5(Key0)) | ||
− | + | $Key3 = $_POST['Key3']; //Key3 - проверка хеша = md5(UTF8(UID теста, имя, оценка, секрет, key0)) | |
− | $ | ||
− | |||
− | |||
− | |||
# текст полей в кодировке UTF-8, данный скрипт сохранить данные в текстовом файл в кодировке Windows-1251 | # текст полей в кодировке UTF-8, данный скрипт сохранить данные в текстовом файл в кодировке Windows-1251 | ||
# для перекодирования используется функция iconv("UTF-8", "Windows-1251", ...); | # для перекодирования используется функция iconv("UTF-8", "Windows-1251", ...); | ||
− | |||
+ | $UId = $_POST['UId']; | ||
$UserName = $_POST['UserName']; | $UserName = $_POST['UserName']; | ||
− | + | if ($UserName == '') return; | |
− | if ($UserName == '') return; | + | $UserGroup = $_POST['UserGroup']; |
− | |||
− | $UserGroup = $_POST['UserGroup'] | ||
− | |||
− | |||
$Mark = $_POST['Mark']; | $Mark = $_POST['Mark']; | ||
− | + | $Result = $_POST['Result']; | |
− | + | $MaskOfResult = $_POST['MaskOfResult']; | |
− | $Result = $_POST['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']; //строка с данными разделенными ";", такая же какую MyTestServer может дописывать к CSV файлу с результатами (можно открыть в электронных таблицах или разобрать как-то самому). | + | //$CSV = $_POST['CSV']; //строка с данными разделенными ";", такая же какую MyTestServer может дописывать к CSV файлу с результатами (можно открыть в электронных таблицах или разобрать как-то самому). |
− | //$ | + | //echo $Version = $_POST['Version']; //номер версии программы, приславшей результаты |
+ | |||
+ | //$_Key2 = md5(md5($UId).$md5SecretKey.$md5Key0); | ||
+ | //if ($Key2 != $_Key2) return; | ||
+ | |||
+ | //$_Key3 = md5($UId.$UserName.$Mark.$SecretKey.$Key0); | ||
+ | //if ($_Key3 != $Key3) return; | ||
//файл с результатами | //файл с результатами | ||
if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){ | if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){ | ||
− | if($_FILES['file']['error'] != UPLOAD_ERR_OK) return; //проверка, что нет ошибок при загрузке | + | 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 | //проверка что файл результатов начинается с MyTestXResult | ||
− | + | $handle = fopen($_FILES['file']['tmp_name'], "r"); | |
$contents = fread($handle, 13); | $contents = fread($handle, 13); | ||
fclose($handle); | fclose($handle); | ||
− | + | if ($contents != 'MyTestXResult') return; | |
− | + | //имя файла под которым сохраним результат | |
− | + | $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; | ||
Строка 95: | Строка 96: | ||
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); | + | //$_Key1 = md5(md5_file($upload_new_file_name).$md5SecretKey.$md5Key0); |
− | if ($Key1 != $_Key1) return; | + | //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" . $MaskOfResult . "\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"; | + | # если файл должен быть в кодировке UTF-8, то строки с iconv нужно убрать или закомментировать |
+ | $str = iconv("UTF-8", "Windows-1251", $str); | ||
$fd = fopen($file_name, 'a') or die('error'); | $fd = fopen($file_name, 'a') or die('error'); | ||
Строка 132: | Строка 135: | ||
echo ' </head>'; | echo ' </head>'; | ||
echo ' <body>'; | echo ' <body>'; | ||
− | + | ||
− | $file_name = $file_dir . ' | + | $file_dir = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/'; |
− | + | $file_name = $file_dir . 'data.txt'; | |
+ | |||
+ | $f = file($file_name); | ||
$table = '<table>'; | $table = '<table>'; | ||
− | $table .= '<tr><th>№</th><th>Дата</th><th>IP</th><th>Имя</th><th>Группа</th><th>Оценка</th><th>Результат в % от макс. баллов</th><th>Файл результата</th><th>Размер файла</th><tr>'; | + | $table .= '<tr><th>№</th><th>Дата</th><th>IP</th><th>Имя</th><th>Группа</th><th>Оценка</th><th>Результат в % от макс. баллов</th><th>Маска результата</th><th>Файл результата</th><th>Размер файла</th><tr>'; |
+ | |||
$count_res = count($f); | $count_res = count($f); | ||
for($i=0; $i<$count_res; $i++){ | for($i=0; $i<$count_res; $i++){ | ||
Строка 147: | Строка 153: | ||
if($j==$count_col-2) { | if($j==$count_col-2) { | ||
$url = 'http://'.$_SERVER['HTTP_HOST'].$r[$j]; | $url = 'http://'.$_SERVER['HTTP_HOST'].$r[$j]; | ||
− | $str = '<a href="'.$url.'">'.basename($r[$j]).'</a>'; | + | //$str = '<a href="'.$url.'">'.basename($r[$j]).'</a>'; |
+ | $str = '<a href="'.$url.'">Скачать</a>'; | ||
}else | }else | ||
$str = $r[$j]; | $str = $r[$j]; | ||
Строка 156: | Строка 163: | ||
$table .= '<table>'; | $table .= '<table>'; | ||
echo $table; | echo $table; | ||
+ | |||
echo ' </body>'; | echo ' </body>'; | ||
echo '</html>'; | echo '</html>'; |
Версия 20:10, 26 марта 2014
Иногда отправлять результаты в модуль Журнал (MyTestServer) нет возможности или не целесообразно. В этом случае можно организовать автоматическую отправку результатов по электронной почте или на web-сервер. Первый способ (по эл. почте) более прост в использовании, но менее удобен. Отправка результатов на веб-сервер требуется наличия веб-сервера, где можно организовать прием, все нужные права доступа и знания по программированию для веб, например на PHP.
Логика приема и обработки результатов на веб-сервере может быть у каждого своя, в этом разделе приведем один из примеров от которого можно отталкиваться. В данном примере не будем использовать базы данных, а для простоты только файлы, вы же можете организовывать работу более сложным и гибким образом.
Но учитывайте, что ориентироваться только на текстовые поля не очень надежно, т.к. данные присылаются так же как и обычной веб-формой. Поэтому в важных случаях обращайте внимание на файл с защ. результатами, который тоже присылается.
Для того чтобы модуль тестирования мог отправлять результаты на веб-сервер необходимо в параметрах теста разрешить данную операцию – Параметры теста → Сохранение и вывод результатов → Отправлять результаты в веб.
Так же необходимо настроить модуль тестирования. В настройках нужно установить переключатель "Разрешить отправлять результаты в web" и указать адрес (URL) страницы, которой будут передаваться результаты. Так же можно задать параметры прокси-сервера (через правку файла настроек). В настройках модуля тестирования и настройках автономного теста данные опции (в этой версии) находятся на вкладке с настройками отправки данных по эл. почте.
И, естественно, у вас должен быть веб-сервер, где вы разместите страницу (скрипт) приема и обработки результатов.
Например, скрипт на PHP для приема и сохранения результатов может выглядеть так:
<?php # MyTestXPro http://mytest.klyaksa.net # скрипт для приёма и сохранения результатов тестирования от модуля тестирования или автономного теста MyTestXPro методом POST # в настройках программы MyTestXPro (точнее в модуле тестирования) в "настройки POST" адрес указываем типа # http://ВАШ-САЙТ/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/SaveResult.php?key=8F480FED-621A-41E1-8CB7-E6D4CC9DB76B //print_r($_POST); //можно проверить ключ (произвольная переменная (метод GET) в адресе скрипта) if ($_GET['key'] != '8F480FED-621A-41E1-8CB7-E6D4CC9DB76B') return; //проверка связи if($_POST['Test'] == 'Test'){ echo 'OK'; return; } //папка с результатами (не забудьте задать права доступа к этой папке, чтобы можно было в нее записывать файлы) $file_dir = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/'; //текстовый файл с результатами (в папке с результатами) $file_name = $file_dir . 'data.txt'; //папка для файлов результатов *.mtxpr (можно задать проще, например, $_SERVER['DOCUMENT_ROOT'].'/MyTestXProResults/Data/') $upload_path_files = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/'; $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)) $Key3 = $_POST['Key3']; //Key3 - проверка хеша = md5(UTF8(UID теста, имя, оценка, секрет, key0)) # текст полей в кодировке UTF-8, данный скрипт сохранить данные в текстовом файл в кодировке Windows-1251 # для перекодирования используется функция iconv("UTF-8", "Windows-1251", ...); $UId = $_POST['UId']; $UserName = $_POST['UserName']; if ($UserName == '') return; $UserGroup = $_POST['UserGroup']; $Mark = $_POST['Mark']; $Result = $_POST['Result']; $MaskOfResult = $_POST['MaskOfResult']; $ip = $_SERVER['REMOTE_ADDR']; $today = date("d.m.Y H:i:s"); //$CSV = $_POST['CSV']; //строка с данными разделенными ";", такая же какую MyTestServer может дописывать к CSV файлу с результатами (можно открыть в электронных таблицах или разобрать как-то самому). //echo $Version = $_POST['Version']; //номер версии программы, приславшей результаты //$_Key2 = md5(md5($UId).$md5SecretKey.$md5Key0); //if ($Key2 != $_Key2) return; //$_Key3 = md5($UId.$UserName.$Mark.$SecretKey.$Key0); //if ($_Key3 != $Key3) return; //файл с результатами 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_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" . $MaskOfResult . "\t" . $upload_new_file_name . "\t" . $upload_size . "\r\n"; # если файл должен быть в кодировке UTF-8, то строки с iconv нужно убрать или закомментировать $str = iconv("UTF-8", "Windows-1251", $str); $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'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/'; $file_name = $file_dir . 'data.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><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>'; $str = '<a href="'.$url.'">Скачать</a>'; }else $str = $r[$j]; $tr .= '<td>'.$str.'</td>'; } $table .= '<tr>'.$tr.'</tr>'; } $table .= '<table>'; echo $table; echo ' </body>'; echo '</html>'; ?>
Вот пример его работы:
Образец файлов можно скачать по ссылке http://yadi.sk/d/DVQTFO5UK3Si6
В архиве папка. Поместите эту папку в корень вашего сайта. Возможно потребуется для вложенной папки для результатов задать права на запись.
Пример пользовательских скриптов, использующих базы данных, вы можете найти на форуме программы.