Upload файла через ОтправитьДляОбработки

  • Автор темы xmailer
  • Дата начала
X

xmailer

#1
Может у кого есть пример реализации загрузки файла на хост. В моем случае:
Код:
	ЗаголовокHTTP = Новый Соответствие(); 
ЗаголовокHTTP.Вставить("Host", "localhost"); 
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data"); 
//ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded"); 
ЗаголовокHTTP.Вставить("Content-Length", "2019"); 

HTTP = Новый HTTPСоединение("localhost");
HTTP.ОтправитьДляОбработки("c:\temp01.dbf", "i.phtml", "c:\out.txt", ЗаголовокHTTP);
//HTTP.Записать("c:\temp01.dbf", "i.phtml", ЗаголовокHTTP);
i.phtml
Код:
<?php
print "<pre>";
print_r($_POST);
print_r($_FILES);
print "</pre>";

if($fp=fopen("out.txt", "wb")){
fwrite($fp, "post: ".sizeof($_POST)."\n");
fwrite($fp, "file: ".sizeof($_FILES)."\n");
fclose($fp);
}
?>
на операции HTTP.ОтправитьДляОбработки все виснет, через длительное время ошибка выполнения ОтправитьДляОбработки
 
T

Typhoon

#2
Твоя проблема в том что для 1с8 нада обязательно для HTTP соединения еще указать настройки прокси сервера иначе оно не будет работать.
 
X

xmailer

#3
Твоя проблема в том что для 1с8 нада обязательно для HTTP соединения еще указать настройки прокси сервера иначе оно не будет работать.
Проблема точно не в этом, заменим часть кода
Код:
	ПроксиСервер = Новый ИнтернетПрокси();
ПроксиСервер.НеИспользоватьПроксиДляЛокальныхАдресов = Истина;

HTTP = Новый HTTPСоединение("localhost",,,, ПроксиСервер);
1С в глубокой задумчивости
 
B
#4
bsa сказал(а):
1. Я пробовал работать с процедурой ОтправитьДляОбработки. В моем случае:
Код:
	ЗаголовокHTTP = Новый Соответствие(); 
ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded"); 

HTTP = Новый HTTPСоединение("localhost");
HTTP.ОтправитьДляОбработки(ИмяПередаваемогоФайла,АдресРесурса,
ИмяВыходногоФайла,ЗаголовокHTTP);
В ЗаголовокHTTP можно больше ничего не вставлять, остальную информацию процедура
передает сама (имя сервера, размер передаваемого файла...)

2. Второй важный момент. Содержимое передаваемого файла должно появиться в
переменной $_POST

3. Я передавал ХМЛ файл.
[codebox]
<?xml version="1.0" encoding="UTF-8"?>
<DATAPACKET version="1.0">
<METADATA>
<FIELDS>
<FIELD FieldName="id_edrpou" FieldType="String"/>
<FIELD FieldName="predpr" FieldType="String"/>
<FIELD FieldName="rs" FieldType="String"/>
<FIELD FieldName="bank" FieldType="String"/>
<FIELD FieldName="mfo" FieldType="String"/>
</FIELDS>
</METADATA>
<ROWDATA>
<ROW mfo="12378654" bank="Аваль" id_edrpou="1212121212" predpr="ЧП "Вектор"" rs="123432"/>
</ROWDATA>
</DATAPACKET>[/codebox]

4. Чтобы этот файл оказался в правильном виде в переменной $_POST, пришлось
преобразовать его к такому виду на стороне 1С8
[codebox]
post_data=левая;?xml version::"1.0" encoding::"UTF-8"?правая;
левая;DATAPACKET version::"1.0"правая;
левая;METADATAправая;
левая;FIELDSправая;
левая;FIELD FieldName::"id_edrpou" FieldType::"String"/правая;
левая;FIELD FieldName::"predpr" FieldType::"String"/правая;
левая;FIELD FieldName::"rs" FieldType::"String"/правая;
левая;FIELD FieldName::"bank" FieldType::"String"/правая;
левая;FIELD FieldName::"mfo" FieldType::"String"/правая;
левая;/FIELDSправая;
левая;/METADATAправая;
левая;ROWDATAправая;
левая;ROW mfo::"12378654" bank::"Аваль" id_edrpou::"1212121212" predpr::"ЧП кавычка;Векторкавычка;" rs::"123432"/правая;
левая;/ROWDATAправая;
левая;/DATAPACKETправая;[/codebox]

5. В переменой $_POST появляется содержимое файла
$PostData = $_POST["post_data"];

6. Сделаем обратное преобразование переменной $PostData к ХМЛ стандарту.

[codebox]
//=== ПРЕОБРАЗОВАТЬ ДАННЫЕ ЗАГРУЖЕННЫЕ ИЗ 1С В ХМЛ ===========//
static function getXML_FromUploadData_1C($PostData){
$search = array("::","левая;","правая;","кавычка;");
$replace = array("=","<",">",""");
$xmlPostData = str_replace($search, $replace, $PostData);
return $xmlPostData;
}

[/codebox]
 
P

Pozitive

#5
Можно сделать лучше, таким макаром можно и архив передать, и символы удалять не нужно.
Установите основной header, примерно так:

Код:
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------69653007630741


Добавить заголовки можно примерно так:

ЗаголовокHTTP = Новый Соответствие(); 
ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded"); 
HTTP = Новый HTTPСоединение("localhost");
HTTP.ОтправитьДляОбработки(ИмяПередаваемогоФайла,АдресРесурса,
ИмяВыходногоФайла,ЗаголовокHTTP);
Также нужно обернуть файлик, который будет отправлять, примерно так:
Код:
-----------------------------69653007630741
Content-Disposition: form-data; name="filename2"; filename="post2_old.zip"
Content-Type: application/zip

СОДЕРЖИМОЕ АРХИВА
-----------------------------69653007630741--
PHP
Код:
if(count($_FILES) > 0) {

if (strpos($system_folder, '/') === FALSE) {
if (function_exists('realpath') AND @realpath(dirname(__FILE__)) !== FALSE){
$system_folder = realpath(dirname(__FILE__)).'/'.$system_folder;
}
} else {
$system_folder = str_replace("\\", "/", $system_folder);
}

foreach ($_FILES as $uploadFile) {
$uploaded_file= $system_folder.'../system/in/offers/'.str_replace(' ', '', $uploadFile['name']);
if (is_uploaded_file($uploadFile['tmp_name'])) {
if (!move_uploaded_file($uploadFile['tmp_name'], $uploaded_file)) {
die('Проблема: невозможно переслать файл в каталог назначения '.$uploaded_file);
}
} else {
die('Error: file not transportet');
}
}
echo "success\n";
}