Имя: Пароль:
1C
1С v8
Отправка файла HTTPСоединение
,
0 SvenSoft
 
10.02.17
21:46
Добрый вечер.

Делаю отправку файла на веб-сервер (в примере текстовый файл, но на самом деле он может быть каким угодно):

[code]
тФайл = новый ТекстовыйДокумент;
тФайл.ДобавитьСтроку("ля ля ля");

ПолноеИмяИсходящегоФайла = ПолучитьИмяВременногоФайла(".txt" );
тФайл.Записать(ПолноеИмяИсходящегоФайла,КодировкаТекста.UTF8);


Попытка
    
    HTTPСоединение = Новый HTTPСоединение("test.ru");

Исключение
    
    Сообщить("Не удалось соединиться с сервером!");
    Возврат Ложь;
    
КонецПопытки;  


//ТелоЗапроса = Новый ДвоичныеДанные(ИмяИсходящегоФайла);  
ТелоЗапроса = Base64Строка(Новый ДвоичныеДанные(ПолноеИмяОтправляемогоФайла));
    
ФайлНаОтправление = Новый Файл(ПолноеИмяОтправляемогоФайла);
ИмяФайла = ФайлНаОтправление.Имя;
РазмерФайла = XMLСтрока(ФайлНаОтправление.Размер());
                
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
КлючПоля = "datafile";

ЗаголовкиЗапроса = Новый Соответствие;
ЗаголовкиЗапроса.Вставить("Content-Type","multipart/form-data; boundary=" + Boundary); // "application/x-www-form-urlencoded"  "application/json"
ЗаголовкиЗапроса.Вставить("Content-Length", РазмерФайла);
ЗаголовкиЗапроса.Вставить("Content-Disposition", "form-data; name=""" + КлючПоля + """; filename=""" + ПолноеИмяОтправляемогоФайла + """");


ФайлОтправки = Новый ЗаписьТекста(ПолноеИмяОтправляемогоФайла, КодировкаТекста.UTF8, Символы.ПС, Ложь);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + КлючПоля + """; filename=""" + ИмяФайла + """");
ФайлОтправки.ЗаписатьСтроку("Content-Type: application/octet-stream" + Символы.ПС + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(ТелоЗапроса);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary + "--");
ФайлОтправки.Закрыть();


HTTPЗапрос = Новый HTTPЗапрос("api/file", ЗаголовкиЗапроса);
HTTPЗапрос.УстановитьИмяФайлаТела(ПолноеИмяОтправляемогоФайла);

HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
[/code]

Но в $_FILES на сервере ничего не прилетает.

Что я делаю не так?
1 Сергиус
 
10.02.17
22:18
(0)А в HTTPОтвет какой статус возвращает?
2 SvenSoft
 
10.02.17
22:37
200
3 Сергиус
 
11.02.17
00:14
(2)Попробуй Wireshark'ом посмотреть что отправляется.
4 SvenSoft
 
11.02.17
14:26
> Попробуй Wireshark'ом посмотреть что отправляется.

Не очень знаком с этим инструментом. Скажу так, что на этой же машине на этот же адрес сайта отправляю файл через Postman - все нормально, из 1С нет!
5 SvenSoft
 
11.02.17
14:53
А вот что формируется в теле запроса кодом из листинга в первом посте:

ФайлОтправки = Новый ЗаписьТекста(ПолноеИмяОтправляемогоФайла, КодировкаТекста.UTF8, Символы.ПС, Ложь);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + КлючПоля + """; filename=""" + ИмяФайла + """");
ФайлОтправки.ЗаписатьСтроку("Content-Type: application/octet-stream" + Символы.ПС + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(ТелоЗапроса);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary + "--");
ФайлОтправки.Закрыть();



--9df4aac7ad4b4197bf18dc6981c6c46f
Content-Disposition: form-data; name="datafile"; filename="v8_D96B_4e.txt"
Content-Type: application/x-octet-stream


77u/0LvRjyDQu9GPINC70Y8NCg==
--9df4aac7ad4b4197bf18dc6981c6c46f--
6 Мимохожий Однако
 
11.02.17
15:04
Синтаксис:

Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>, <ИспользоватьАутентификациюОС>)
7 SvenSoft
 
11.02.17
15:17
И только первый параметр обязателен, все остальные мне по умолчанию подходят.
8 SvenSoft
 
11.02.17
15:21
остальные запросы GET, РUT, POST (кроме отправки файла) нормально отрабатывают, проблема только с отправкой файла.
9 oleg_km
 
12.02.17
19:24
Сравни Fiddler ом. Сразу увидишь в чем дело
10 Сергиус
 
13.02.17
01:40
(4) Да там все интуитивно понятно, качни - и хоть понятно будет, отправляется что-то или нет.
AdBlock убивает бесплатный контент. 1Сергей