Передача параметров и файлов на Web-сервер, используя 1С:Предприятие 7.7

Приветствую Вас, уважаемый читатель нашего блога SoftMaker.kz! Здесь приведен и подробно объяснён код на встроенном языке 1С:Предприятие 7.7 по созданию HTTP запроса к Web-серверу методом 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-тэгу <input type="file" name="data"> 
  //Поле filename указывает на раздел передачи файла
  |Content-Disposition: form-data; name=""data""; filename=""" + ФайлДанных + """
  |Content-Type: application/xml;" + РазделительСтрок + РазделительСтрок + "
  |" + СтрокаBase64 + РазделительСтрок + "
  //Определяем раздел для других POST-данных, 
    //например содержимого полей виртуальной HTML-формы.
  |--" + Boundary + "
  //Соответствует HTML-тэгу <input type="text" name="user" id="user">
  |Content-disposition: form-data; name=""user""" + РазделительСтрок + 
    РазделительСтрок + "
  |root" + РазделительСтрок + "
  |--" + Boundary + "
  //Соответствует HTML-тэгу <input type="text" name="pswd" id="pswd">
  |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));

Две строки приведенные выше соответствуют заголовку, например:

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);
        
    }
}
?>

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

ПОДПИСКА

15 ответы
  1. Igor говорит:

    Есть ли документация по Base64.dll
    с описанием методов, желательно ALS файл?

  2. иДиот говорит:

    решение тупее не бывает…
    "если размер строки больше 385 Кб 1С вылетает" — автор, цена такому скрипту грош…

  3. Softmaker говорит:

    Если Вы смыслите в 1С, то должны понимать, что все претензии к разработчикам системы 1С:Предприятие 7.7

  4. Костя говорит:

    В файле Message.txt не записывается передаваемые переменные. Вот что получается:
    User:
    Password:
    tmp_name1:

  5. Softmaker говорит:

    А post-запрос правильно у вас работает. Дело в том, что это рабочий вариант кода у меня все записывает.

  6. Костя говорит:

    Я так понял переменные не передаются! Проверка условия на пустоту $pswd не истина! Пост-запрос вроде такой же.

  7. вит говорит:

    у меня есть код (70строк) для кодировки base64, программно из 1С, без использования внешних компонент. Работает в разы быстрее. Полностью рабочий, используется на реальном сайте. Кому надо пишите в личку

  8. Макс говорит:

    Так этот код рабочий ? , что то пытаюсь передать файл, но при кодировании пишет "размер файла 0 "

  9. Юрий говорит:

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

  10. Softmaker говорит:

    Здравствуйте, Юрий! Все что здесь написано это полный код.

  11. Fish говорит:

    Подскажите, как будет правильно: на главной странице сервера зарегистрироваться (логин,пароль), после перейти на страницу с определенными настройками и выгрузить файл RAR. Попробовал Ваш вариант (в моем случае 2 запроса), сервер возвращает статус 500

  12. Softmaker говорит:

    Здравствуйте, Fish! Проверьте правильность отправки запроса. И доступ к этому адресу на сервере.

Комментарии закрыты.