<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Хорошая и полезная статья.
А как отправить простой POST запрос без файла?
Например, авторизация на infostart.
Вот так и отправить. Выкидываешь из файла отправки или содержимого POST-запроса лишнее, то что относится к двоичным данным или файлам, и отправляешь.
Изучай матчасть по генерации HTTP запросов, ссылки я для чего дал?
От нечего делать, пока у нас сервер лежал, накатал обработку, иллюстрирующую пример POST-запроса без файлов.
В качестве сайта — подопытного кролика выбран инфостарт
http://forum.aeroion.ru/download.php?id=165
Скачать
(4) Спасибо, теперь можно изучать
Почему таким сложным путем?
Лёгкие пути в студию. Про передачу по ftp знаю, не тот в данном случае путь.
Можно ли как-то передать файл на сервер из 7.7 ?
Можно. Только я от клюшек давно отошёл, забыл её как страшный сон, и даже искать что-то по ней неохота. Гугл вам поможет.
Спасибо за доходчивое объяснение
Спасибо вам большое за POST запрос.
Но у меня не получается отправить этот POST запрос вроде сделала все как описано выше. Запрос доходит, но без файла.
Все выглядит так :
СодержимоеZIP = Base64Строка(Новый ДвоичныеДанные(АрхивФайлаZIP));
ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, ЛОЖЬ);
ФайлОтправки.ЗаписатьСтроку(«—» + Boundary);
ФайлОтправки.ЗаписатьСтроку(«Content-disposition: form-data; name=»»key»»» + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(«11111»);
ФайлОтправки.ЗаписатьСтроку(«—» + Boundary);
ФайлОтправки.ЗаписатьСтроку(«—» + Boundary);
ФайлОтправки.ЗаписатьСтроку(«Content-Disposition: form-data; name=»»dump»»; filename=»»» + СчетчикВыгрузок+».zip» + «»»»);
ФайлОтправки.ЗаписатьСтроку(«Content-Type: application/x-zip-compressed» + Символы.ПС + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(СодержимоеZIP);
ФайлОтправки.ЗаписатьСтроку(«—» + Boundary);
ФайлОтправки.ЗаписатьСтроку(«—» + Boundary);
ФайлОтправки.ЗаписатьСтроку(«Content-disposition: form-data; name=»»submit»»» + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(«Загрузить»);
ФайлОтправки.ЗаписатьСтроку(«—» + Boundary);
ФайлОтправки.Закрыть();
Пожалуйста помогите что не так?
Сделать именно так, как в примере формирования содержимого POST-запроса. Имейте в виду, этот код практически полностью приведён из рабочей конфигурации.
Посмотреть содержимое массива $_FILES, $_POST на сервере.
В конце концов, проверить размер передаваемых данных.
Ошибка работы с Интернет: server returned nothing (no headers, no data)
Такая ошибка вылетает… В чем проблема? Код взят из этой статьи.
Показать
Пример реализации, используя, 1С:Предприятие 7.7здесь.
Попробовал, работает. Спасибо! 🙂
Здравствуйте.
Возникла проблемка:
если выполнять на стороне клиента, все нормуль;
но если то же самое делать на стороне сервера (регл. заданием), приходит пустой ПОСТ на сервер 🙁 . ФайлОтправки и файл данных — идентичны.
Посоветуйте, плиз, где искать косяк…
(16) Похожая проблема
http://www.forum.mista.ru/topic.php?id=476078
Ишите косяк или на веб-сервере или на сервере 1С, а то и на обоих.
Лёгкие пути в студию. Про передачу по ftp знаю, не тот в данном случае путь.
Действительно, более легкие пути шли не туда. Этот работает. Спасибо
Отличная статья, спасибо!
Единственное возник вопрос.
Переводя текст в Base64 методом:
СодержимоеZIP = Base64Строка(Новый ДвоичныеДанные(ИмяФайлаДанных));
Как сделать обратное??
Т.е. из Base64 перевести в исходный текст???
(19)Base64Значение(СодержимоеZIP)…советую воспользоватся справкой в 1С
cool.vlad4, да, спасибо большое. Но на выходе будут двоичные данные, а их как преобразовать к исходнику?
(извиняюсь за нубство, просто уже устала искать))
(21) ДвоичныеДанные.Записать(ИмяФайла), да ничего страшного, я просто имею ввиду, что быстрее такие вопросы в поиске посмотреть, ведь все методы и свойства помнить невозможно. В конфигураторе нажимаете F1, вводите в поиске ДвоичныеДанные и находите ответ на свой вопрос. Также рекомендую использовать (если есть конфигурация, типовая к примеру) поиск по конфигурации и смотреть как это сделано там.
А как использовате Get метод
И как можно передать куки с одной сесии в другую или єто невозможно, или вытянуть куки из браузера?
(24) softest, для работы с куки можно использовать WinHttpRequest
как-то так (писалось на скорую руки, возможны ошибки, но смысл, думаю, понятен)
Показать
А вообще можно файлы передавать как есть в виде двоичных данных с помощью процедуры «ОбъединитьФайлы»
Показать
(26) А вы пробовали? Данные точно попадают в массив $_FILES на сервере?
(27) пробовал. И со своим сайтом. И на стену ВКонтакте таким способом картинки загружаются без проблем.
(28) Очень интересно. Знать бы этом когда делал проект или догадаться проверить. В этом случае статья могла и не появиться на свет.
Нужно ещё прокомментировать, как правильно формировать boundary в соответствии с RFChttp://ru.wikipedia.org/wiki/MIME#.D0.9E.D1.80.D0.B3.D0.B0.D0.BD.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85
Начало каждой части сообщения обозначается строкой «—boundary». Конец последнего сообщения обозначается строкой «—boundary—». Самые первые символы переноса строки CRLF (коды 13 и 10), которыми начинаются и заканчиваются пограничные строки не входят в содержимое самой части. Если за ними следуют ещё переносы строк, то они уже принадлежат включаемой части.
В моём случае долго не получалось увидеть на стороне сервера что-либо в массиве $_FILES пока я не догадался вставить ещё один перенос строки в самое начало отправляемого файла (так называемая преамбула):
Показать
Спасибо большое за статью!
Очень выручили!
Есть, правда, вопрос:
использование Base64 продиктовано тем, что данные могут содержать HTML-значимые символы? И я должен использовать кодирование base64 только в случае, если сервер производит декодирование, верно? Если же сервер этого не делает, то я могу отправлять текст файла как он в файле записан.
(30)
У меня заработало без первой пустой строки.
(31) В посте (26) написано, как обойтись без Base64.
(32) Я использовал текстовый документ для получения текста.
Надо бы переработать статью с учетом рекомендаций.
При загрузке на сайт получал ошибку от ОтправитьДляОбработки Failed sending data to the peer.
Оказалось, что проблема с параметром HTTP заголовка:
ЗаголовокHTTP.Вставить(«Referer», СерверИсточник);
Двое из трех хостингов плевали на этот параметр, а zenon выдавал упомянутую выше ошибку.
Поручик, уберите этот параметр из статьи, чтоб другие не сталкивались с такой проблемой.
Статья переработана с учетом комментариев и приложена новая обработка с примерами отправки файла на сервер двумя способамии.
Доброго дня. Информация очень интересна и полезна, спасибо автору. Но у меня возникает вопрос. Админ или программист на стороне сайта(я на стороне 1С программиста) требует от меня вставить в POST строку «pass=тут_пароль», куда конкретно вставить он не может сказать в заголовок ли в ФайлОтправки или еще куда. Подскажите, пожалуйста, куда этот реквизит вставить?
(37) В файл отправки. Пример смотрите в обработке, там всё есть.
Доброе время суток!
я все прописываю как написано у вашей статье, но никак не получается отправить запрос, постоянно пустой POST массив отправляется… Можете помочь? Спасибо
(39) скачайте любую из приложенных обработок, они все рабочие.
помощь платная.
Спасибо.Я попробовал пользоваться ваши обработки, но результат тот же.Может сталкивались с подобной проблемой, что пустой запрос отправляет?
(41) Обратите внимание на мой комментарий в этом обсуждении (30)
спасибо, очень нужная информация
Коллеги, а с чем может быть связана ошибка
Ошибка при вызове метода контекста (ОбъединитьФайлы): Ошибка сборки файла
ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
по причине:
Ошибка сборки файла
по причине:
Ошибка совместного доступа к файлу ‘C:UsersObrAppDataLocalTemp2v8_58C6_75.txt’
(44) Она может быть связана с ошибкой совместного доступа к файлу ‘C:UsersObrAppDataLocalTemp2v8_58C6_75.txt’
(45) да я догадалась) А это было связано с тем, что был забыт метод ФайлОтправкиСередина.Закрыть(); Ну и в общем, если один из кусков собираемого файла не закрыт, его и объединить не получится, что логично.
в 8.3 Механизм теперь другой. Нет примера обработки с механизмом на 8.3?
(47) Сделаю. Пятьсот рублей будет стоить.
(48) Спасибо, уже сам сделал)))
Добавлена обработка для платформы 8.3. в режиме управляемого приложения
Мне пришлось добавить перевод строки перед Баундэри, который сразу за двоичными данными. После двоичных данных у меня больше никаких разделов не было, поэтому этот же Баундэри стал последним.
Оригинальный код автора:
ФайлОтправкиКонец.ЗаписатьСтроку(«—» + Boundary + «—«);
Мой код:
ФайлОтправкиКонец.ЗаписатьСтроку(Символы.ПС+»—» + Boundary + «—«);
Большое спасибо автору за статью! Поставил плюс!
(51) Этот вариант статьи давно устарел, но заливать новый нет желания, так как двиг сайта курочит оформление по-своему, то есть вся работа под хвост. Новая версия находится на моём сайте.
Статья порядком устарела.
Обновил обработку Отправка данных и загрузка файлов на веб-сервер 8.3.epf, в которой реализовано скачивание файлов с почти любого сайта, в том числе Google Drive, показаны методы работы с отсылкой и получением HTTP-заголовков, работа с перенаправлением (редиректом), кукисами (cookies) и некоторые другие. Всё для платформы 8.3.
(0) спасибо за столь обширное описание
По мотивам статьи. Коротенькая функция, отправляющая файлы и данные через POST без создания временных файлов.
Показать
Пример вызова:
Показать
Поручик, запускаю вашу обработку «ПросмотрИнфостарт.epf», пишет:
301 Moved Permanently
———————————————————————————
nginx
Есть ли обработка на управляемой форме или можешь доделать эту обработку если не сложно?
(56) Сдалась она тебе. Это давно устаревший вариант, чисто для примера.
(58) ясно. Поищу её где-нибудь в другом месте с авторизацией.
Спасибо за публикацию!
Отправить корректно двоичные данные (файл) на сервер получилось можно только через «ОбъединитьФайлы».
(58) Зачем оставлять выложенные устаревшие варианты.
(61) Это исключительно абстрактные примеры, а не для практического использования.
Добавлю еще один способ отправки используя multipart/form-data
.Net в 1С. Примеры использования HTTPClient, AngleSharp. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д. .
Статья очень хорошая. Сколько будет стоить помощь в написании кода отправки данных из 1с на веб-серевер через post -запросы,а также комментарии по некоторым вопросам? Код необязательно , чтобы был рабочим, главное, чтобы он отражал всю логику передачи — нужен для курсовой работы.
(64) Так вот, в обработке всё рабочее и прокоментирована вся логика.
(39) lazorik,
Уже наверно неактуально.
В моём случае долго не получалось увидеть на стороне сервера что-либо в массиве $_FILES пока я не догадался вставить ещё один перенос строки в самое начало отправляемого файла (так называемая преамбула):
ФайлОтправки.ЗаписатьСтроку(«»); // <— вот она, недостающая строка
(65) Сергей, скажите пожалуйста, у Вас есть замечательная функция:
Показать полностью
Но она работает для 1С версии 8.2.18 и выше. Есть ли аналог для устаревших версий 1С, это нужно для 8.2.13 🙁
Вы используете рекурсивное получение для адресов, которые с кодами 301, 302.
Может есть, что для моего случая?
Спасибо.
(67) Разумеется нет. Я уже забыл про 8.2.
В обработке для 8.3 параметр Порт задан строкой, «80», что приводит к ошибке «Несоответствие типов». И изменить нельзя, на модуле пароль. Исправьте и выложите рабочую версию, либо версию без пароля на модуле.в управляемой форме все ок
(69) Выдернуть и сделать обработку для обычного приложения несколько минут.
Ошибка работы с Интернет: server returned nothing (no headers, no data)
Такая ошибка вылетает… В чем проблема?
Добрый день, а почему модуль объекта запоролен?
Там ничего интересного и практического нет.
С потоками тоже хорошо получается
Показать