Передача параметров и файлов на 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); } } ?>
Итак, в этом листинге происходит приём параметров и сохранение файла на сервере. Параметры, выделенные жирным шрифтом, принимаются здесь на сервере.
httpRequest.open("POST", "http://yoursite/file.php", 0);
это создается в 1с?
Да, Сергей, Вы правы.
Есть ли документация по Base64.dll
с описанием методов, желательно ALS файл?
Описание Base64.dll здесь:
http://www.softmaker.kz/files.php?cat=8&id=24
решение тупее не бывает…
"если размер строки больше 385 Кб 1С вылетает" — автор, цена такому скрипту грош…
Если Вы смыслите в 1С, то должны понимать, что все претензии к разработчикам системы 1С:Предприятие 7.7
В файле Message.txt не записывается передаваемые переменные. Вот что получается:
User:
Password:
tmp_name1:
А post-запрос правильно у вас работает. Дело в том, что это рабочий вариант кода у меня все записывает.
Я так понял переменные не передаются! Проверка условия на пустоту $pswd не истина! Пост-запрос вроде такой же.
у меня есть код (70строк) для кодировки base64, программно из 1С, без использования внешних компонент. Работает в разы быстрее. Полностью рабочий, используется на реальном сайте. Кому надо пишите в личку
Так этот код рабочий ? , что то пытаюсь передать файл, но при кодировании пишет "размер файла 0 "
Уважаемые профи. Можно ли полностью получить код? Попытался реализовать что-то подобное, никак не отправляется файл.
Буду очень признателен за оперативную помощь.
Здравствуйте, Юрий! Все что здесь написано это полный код.
Подскажите, как будет правильно: на главной странице сервера зарегистрироваться (логин,пароль), после перейти на страницу с определенными настройками и выгрузить файл RAR. Попробовал Ваш вариант (в моем случае 2 запроса), сервер возвращает статус 500
Здравствуйте, Fish! Проверьте правильность отправки запроса. И доступ к этому адресу на сервере.