8.х Выгрузка файла по протоколу HTTP

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем mialord, 17 июн 2012.

  1. TopicStarter Overlay
    mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здраствуйте!
    Пишу обработку для фоновой отправки файлов из базы данных на сайт фирмы. В процессе работы столкнулся с траблой

    Код:
    ЗаголовокHTTP = Новый Соответствие();
    
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
    СерверИсточник = НСтр(СтрокаСоединения, "Srvr") + НСтр(СтрокаСоединения, "Ref");
    ЗаголовокHTTP.Вставить("Referer", СерверИсточник);
    
    ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
    ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
    НТТР = Новый HTTPСоединение("ТУТИМЯСЕРВЕРА", "80");АдресСкрипта = "/load_catalog.php?guid=КлючБезопасности";
    Попытка
    НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСкрипта, ИмяФайлаОтвета, ЗаголовокHTTP);
    Исключение
    //Пример обработки ошибки соединения.
    #Если Клиент Тогда
    Сообщить("Неудачная попытка соединения: " + ОписаниеОшибки());
    #Иначе
    ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Неудачная попытка соединения: " + ОписаниеОшибки());
    #КонецЕсли
    Возврат;
    КонецПопытки;
    Данный код отправляет файл по протоколу http, однако со стороны сервера вижу что файл не пришел
    PHP:
    <br />
    <
    b>Notice</b>: Undefined variablemyfile_name in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>44</b><br />
    <
    br />
    <
    b>Warning</b>: fopen(zip/) [<a href='function.fopen'>function.fopen</a>]: failed to open streamIs a directory in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>45</b><br />
    <
    br />
    <
    b>Warning</b>: fwrite(): supplied argument is not a valid stream resource in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>46</b><br />
    <
    br />
    <
    b>Warning</b>: fclose(): supplied argument is not a valid stream resource in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>51</b><br />
    Error PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'zip/'<br />
    <
    b>Warning</b>: rename(xml/parent.xml,xml/parent_1.xml) [<a href='function.rename'>function.rename</a>]: No such file or directory in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>133</b><br />
    <
    br />
    <
    b>Warning</b>: simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: xml/:1parser error Document is empty in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>150</b><br />
    <
    br />
    <
    b>Warning</b>: simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>150</b><br />
    <
    br />
    <
    b>Warning</b>: simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: ^ in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>150</b><br />
    <
    br />
    <
    b>Warning</b>: simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: xml/:1parser error Start tag expected'&lt;' not found in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>150</b><br />
    <
    br />
    <
    b>Warning</b>: simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>150</b><br />
    <
    br />
    <
    b>Warning</b>: simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: ^ in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>150</b><br />
    <
    br />
    <
    b>Warning</b>: Invalid argument supplied for foreach() in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>153</b><br />
    <
    br />
    <
    b>Warning</b>: unlink(xml/) [<a href='function.unlink'>function.unlink</a>]: Is a directory in <b>/var/www/assorti24.rf/data/www/xn--24-6kc6a3amfal.xn--p1ai/load_parent.php</bon line <b>173</b><br />
    Группы успешно загружены!<br>
    Портянка с ошибкой большая, но суть лишь в том что данных нет. Отправлял архив, двоичные данные сейчас отправлять не могу ибо php надо тогда дописывать, кто выгружал по данному протоколу архивы zip, у кого есть опыт, или, еще лучше код передачи архивов? В интернете лишь абстрактные ответы.
  2. TopicStarter Overlay
    mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Разобрался, ниже функция для отправки архива (решение не мое, с форума), единственное, пришлось адаптировать сервер на прием бинарного сообщения
    Код:
    Функция ОтправитьФайлНаСервер(ИмяФайла, ЕдиныйBoundary, Сервер, Порт, АдресСкрипта)
    
    Boundary = ЕдиныйBoundary; // Уникальный разделитель, например: СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    
    //Определяем имя файла ответа от веб-сервера
    ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();
    
    ИмяФайлаДанных = ИмяФайла;
    
    СодержимоеZIP = Base64Строка(Новый ДвоичныеДанные(ИмяФайлаДанных));
    
    ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
    ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, ЛОЖЬ);
    
    //Определяем раздел двоичных данных
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    //Указываем имя файла для передачи
    ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""data""; filename=""" + ИмяФайлаДанных + """");
    //Указываем тип передаваемых данных.
    //С таким же успехом в Content-Type можно указать application/x-octet-stream
    ФайлОтправки.ЗаписатьСтроку("Content-Type: application/x-zip-compressed" + Символы.ПС + Символы.ПС);
    //Записываем кодированные двоичные данные
    ФайлОтправки.ЗаписатьСтроку(СодержимоеZIP);
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    
    //Определяем раздел для каких либо других POST-данных, например содержимого полей виртуальной HTML-формы.
    
    //Соответствует HTML-тэгу input type="submit" name="submit" value="Submit" /
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""submit""" + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку("1");
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    
    //Соответствует HTML-тэгу
    //input type="text" name="some_field" value="Some text" /
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""some_field""" + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку("Some text");
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
    
    ФайлОтправки.Закрыть();
    
    ЗаголовокHTTP = Новый Соответствие();
    
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
    СерверИсточник = НСтр(СтрокаСоединения, "Srvr") + НСтр(СтрокаСоединения, "Ref");
    ЗаголовокHTTP.Вставить("Referer", СерверИсточник);
    
    //Укажем формат данных Content-Type
    ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
    
    //Укажем длину POST-запроса Content-Length
    ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
    
    НТТР = Новый HTTPСоединение(Сервер, Порт);
    
    Попытка
    НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСкрипта, ИмяФайлаОтвета, ЗаголовокHTTP);
    Исключение
    //Пример обработки ошибки соединения.
    #Если Клиент Тогда
    Сообщить("Неудачная попытка соединения: " + ОписаниеОшибки());
    #Иначе
    ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Неудачная попытка соединения: " + ОписаниеОшибки());
    #КонецЕсли
    Возврат ложь;
    КонецПопытки;
    
    //Удалим файл отправки POST-запроса. Больше он нам не нужен.
    УдалитьФайлы(ИмяФайлаОтправки);
    
    ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
    Если ФайлОтвета.Существует() Тогда
    ТекстОтвета = Новый ТекстовыйДокумент();
    ТекстОтвета.Прочитать(ИмяФайлаОтвета);
    Если ТекстОтвета.КоличествоСтрок() > 0 Тогда
    ОтветСервера = ТекстОтвета.ПолучитьТекст();
    #Если Клиент Тогда
    Сообщить(ОтветСервера);
    #КонецЕсли
    Иначе
    #Если Клиент Тогда
    Сообщить("Отправка файла на сервер: Получен пустой ответ сервера.");
    #Иначе
    ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Получен пустой ответ сервера.");
    #КонецЕсли
    КонецЕсли;
    УдалитьФайлы(ИмяФайлаОтвета);
    Иначе
    #Если Клиент Тогда
    Сообщить("Отправка файла на сервер: Ответ сервера не получен.");
    #Иначе
    ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Ответ сервера не получен.");
    #КонецЕсли
    КонецЕсли;
    
    КонецФункции
  3. bimcom
    Offline

    bimcom

    Регистрация:
    25 июл 2013
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    А в чем заключается адоптация сервера?
    Использовал функцию - файл выгружается (судя по активности интернет соединения) но на сервере во временную папку не попадает и move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir) не приносит ожидаемого результата.
  4. TopicStarter Overlay
    mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Толком уже не помню, давно это было
    Точно помню что php не узнавал файл ибо он кодирован в base 64.
    У Вас ответ от сервера о получении файла вообще приходит?
    Код:
    ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
  5. bimcom
    Offline

    bimcom

    Регистрация:
    25 июл 2013
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Да сервер отвечает - выводом print_r($GLOBALS)
    и там видно - что файл прилетает, но никуда не сохраняется.
    PHP:
     [_FILES] => Array
    (
    [
    data] => Array
    (
    [
    name] => data.xml
    [type] => application/x-zip-compressed
    [tmp_name] => /var/www/sait/data/mod-tmp/php1NVFG8
    [error] => 0
    [size] => 1301257
    )

    )

    Погуглю пока пока про чтение кодированных файлов base64
  6. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    В php я 0.
    Но если вам такая конструкция о чем-то скажет, попробуйте:
    Код:
    $postdata = file_get_contents("php://input");
    Насколько я понимаю, получите содержимое переданного файла в виде строки. Пишете потом во временный файл (ну или сразу обрабатываете).
  7. bimcom
    Offline

    bimcom

    Регистрация:
    25 июл 2013
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Пробовал - но никакого результата.
    Надоело мне выяснять в чем дело на сервере - буду отправлять данные в переменной, а не файлом.(к сожалению придется отказать от сжатия, ну да ладно)

    в указанной выше функции выпилил все лишнее, а использую
    ФайлОтправки.ЗаписатьСтроку("Some text");
    вместо
    "Some text"
    подставляю свои данные - сейчас тестирую какой размер можно таким образом передать.
  8. bimcom
    Offline

    bimcom

    Регистрация:
    25 июл 2013
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Эх ... не долгим было мое счастье - данные перестали приниматься сервером при достижение размера отправляемых данных в 1й переменной 1Мб, притом что отправив за раз 3 переменные по 900кб - пролетали на ура.
    Долго бился - оказалось на сервере стоит suhosin и его директива
    suhosin.request.max_value_length 1000000 (как раз мегабайт - меняем на нужное)
    не пропускала длинные переменные.

Поделиться этой страницей