Modber Сообщество
профессионалов по 1С

Отправка настроек и файлов на веб-сервер. 1С: Предприятие 7.7



Платформы: 1С:Предприятие 7.7
Конфигурации: Другие конфигурации
2014-04-28
3241 
Wolve
0  

Здравствуйте, уважаемые читатели. В данной статье представлен и подробно разобран программный код на языке, который встроен в 1С: Предприятие 7.7, по работе над запросами HTTP к веб-серверу, посредством метода POST.

В следующем примере используется внешний компонент программы Base64.
Также здесь используется специальный объект winhttprequest для построения запроса на сервер, кроме уже имеющегося в составе внешних компонентов 1Сv7Plus следующего объекта V7HTTPReader.

 
   //Используем следующий объект winhttprequest для задания HTTP-запросов к нашему серверу
    httpRequest = СоздатьОбъект("winhttp.winhttprequest.5.1");
    Boundary = "28405758029000";
    ФайлДанных = "data.txt"; 

    
    ПутьКФайлуДанных = КаталогПользователя() + ФайлДанных;
    // Пользуемся внешней компонентой Base64.dll для трансформирования строки
    СтрокаBase64 = Base64(ФайлДанных);// Интересно, 
    Если СтрокаBase64 = "" Тогда        //если объем строки больше чем 385 Кб 1С летит…    
        Сообщить("Файл " + ПутьКФайлуДанных + " не содержит ни единой строки!","!");
        Возврат;
    КонецЕсли;


 

В нижеследующем абзаце разъяснен создания POST-запроса. При создании запроса нужно быть довольно внимательным, для того чтобы правильно расставлять грани разделов, а также переносы строк. Параметры, которые выделены жирным курсивным стилем шрифта, впоследствии принимают на сервере.

    

//Назначаем раздел двоичных данных, затем определяем имя файла для последующей передачи
   Text1 = "--" + Boundary + "
  //Равен HTML-тэгу  
  //Поле filename показывает ту часть передачи файла
  |Content-Disposition: form-data; name=""data""; filename=""" + ФайлДанн + """
  |Content-Type: application/xml;" + РазделительСтрок + РазделительСтрок + "
  |" + СтрокаBase64 + РазделительСтрок + "
  //Назначаем раздел для остальных POST-данных,
    //например состава полей виртуальной HTML-формы.
  |--" + Boundary + "
  //Равен HTML-тэгу
  |Content-disposition: form-data; name=""user""" + РазделительСтрок +
    РазделительСтрок + "
  |root" + РазделительСтрок + "
  |--" + Boundary + "
  //Равен HTML-тэгу
  |Content-disposition: form-data; name=""pswd""" + РазделительСтрок +
    РазделительСтрок + "
  |Qy6j904j" + РазделительСтрок + "
  |--" + Boundary + "--"
Назначается открытие (open) нового соединения со следующим адресом http://yoursite/file.php:

httpRequest.open("POST", "http://yoursite/file.php", 0);




Конструируем следующий заголовок POST-запроса. Пользуемся форматом — multipart/form-data, для той цели, чтобы отправлять кроме основных параметров(у нас ими являются user и pswd), но также и файлы. Данный формат разрешает поделить на специальные части тело запроса (Entity-Body), путем раздела его на границы (boundary).

 

httpRequest.setRequestHeader("Content-Type","multipart/form-data;boundary=" + Boundary);
Зададим объем POST-запроса Content-Length:

httpRequest.setRequestHeader("Content-Length", СтрДлина(Text1));
2 строки следовавшие выше равняются заголовку, к примеру:

Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467Arn 
Content-Length: 567rn rn

httpRequest.send(Text1);// Интересно, но когда размер строки больше чем 385 Кб 1С летит...
if (httpRequest.Status = 200) then
    Ответ = httpRequest.ResponseText;//Значение появляется, только если в file.php пользуемся echo   
endif;

 

Внизу указан листинг следующего файла file.php:
 

//Считываем текстовую информацию POST-запроса
if (isset($_POST['user']))   {$user = $_POST['user']; if ($user == '') {unset($user);}}
if (isset($_POST['pswd']))   {$pswd = $_POST['pswd']; if ($pswd == '') {unset($pswd);}}

$fp = @fopen("Message.txt", 'wb');
@fclose($fp);
//
Переписываю отправляемую информацию в файл Message.txt
file_put_contents("Message.txt","rnUser: ".$user."n", FILE_APPEND);
file_put_contents("Message.txt","rnPassword: ".$pswd."n", FILE_APPEND);
file_put_contents("Message.txt","rntmp_name1: "
.$_FILES['data']['tmp_name']."n", FILE_APPEND);
if ( !empty($pswd) )
{

   //Здесь будем работаем с составом отправленного файла.
    $uploadFile = $_FILES['data'];
    $tmp_name = $uploadFile['tmp_name'];
    file_put_contents("Message.txt","rntmp_name2: ".$tmp_name."n", FILE_APPEND);
    if ( !is_uploaded_file($tmp_name) )
    {
        file_put_contents("Message.txt","rnОшибка при загрузке файлаn", FILE_APPEND);
        echo "failuren";
        die('Ошибка в загрузке файла');
    }
    else
    {
        //
Считываем файл в следующую строку
        $data = file_get_contents($tmp_name);
        //Декодируем наши данные
        $data = base64_decode($data);
        //
Сейчас нормальный файл уже можно сохранить на нашем диске
        $data_filename = $_FILES['data']['name'];
        file_put_contents("Message.txt","rndata_file: ".$data_filename."n" , 
            FILE_APPEND);

        if ( !empty($data) && ($fp = @fopen($data_filename, 'wb')) )
        {
            @fwrite($fp, $data);
            @fclose($fp);
            echo "successn";
        }
        unset($data);
        
    }
}
?>


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




В центре внимания

Комментарии (0)