Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Проблема с отправкой HTTP POST multipart/from-data

Проблема с отправкой HTTP POST multipart/from-data
Я
   BayunTheCat
 
01.11.19 - 06:26
Здравствуйте, подскажите пожалуйста где у меня ошибка?
&НаСервере
Функция ПодготовитьКОтправке(АдресДвоичныхДанных, имяФайла)
    
    //СодержимоеФайла = Base64Строка(ПолучитьИзВременногоХранилища(АдресДвоичныхДанных));
    СодержимоеФайла = ПолучитьИзВременногоХранилища(АдресДвоичныхДанных);
    ПотокТело = Новый ПотокВПамяти();
    ФайлОтправки = Новый ЗаписьДанных(ПотокТело,КодировкаТекста.UTF8);
    ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайла + """");
    ФайлОтправки.ЗаписатьСтроку("Content-Type: image/jpeg");
    
    //файлОтправки.ЗаписатьСтроку("Content-Type: application/octet-stream\r\n");
    //файлОтправки.ЗаписатьСтроку("Content-Transfer-Encoding: binary\r\n");
    ФайлОтправки.ЗаписатьСтроку("");
    ФайлОтправки.Записать(СодержимоеФайла);
    ФайлОтправки.ЗаписатьСтроку("");
    ФайлОтправки.Закрыть();
    ДвоичныеДанныеТело = ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
    Возврат ДвоичныеДанныеТело;    
КОнецФункции
    
&НаСервере
Функция ОтправитьФаил(имяфайлаПолноеНаКлиенте,ИмяФайлаКр, АдресДвоичныхДанных)
    
    ДвоичныеДанныеКартинка = ПодготовитьКОтправке(АдресДвоичныхДанных,ИмяФайлаКр);
    Разделитель = "AWESOMEDELIMETER";

//    Соединение = ср_ОбщиеФункцииСервер.ПолучитьСоединениеССайтом();
    Соединение = Новый HTTPСоединение("192.168.0.5", 8000, , ,,, Неопределено);

    ЗаголовокHTTP = Новый Соответствие();
   //Обязательные поля заголовка      
   //Укажем формат данных Content-Type
    ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);

    //Укажем длину POST-запроса Content-Length
  

    ЗапросHTTP = Новый HTTPЗапрос();
    ЗапросHTTP.АдресРесурса = "/api-auth/sku/set_sku_information/";
    ЗапросHTTP.Заголовки = ЗаголовокHTTP;
    ПотокТело = Новый ПотокВПамяти();
    ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    //ЗаписьДанных.ЗаписатьСтроку(Символы.ПС)
    ЗаписьДанных.Записать(ДвоичныеДанныеКартинка);
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
    ЗаписьДанных.Закрыть();
    ДвоичныеДанныеТело = ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
    ЗаголовокHTTP.Вставить("Content-Length", ДвоичныеДанныеТело.Размер());
    ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТело);
    ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP);    
    Результат = ОтветHTTP.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    УдалитьИзВременногоХранилища(АдресДвоичныхДанных);
 
 
   ДенисЧ
 
1 - 01.11.19 - 06:27
Судя по всему - в ДНК.
Ошибки не привёл, причин возникновения вопроса тоже...
   BayunTheCat
 
2 - 01.11.19 - 07:02
Ты я вижу умеешь оскороблять людей, жаль не умеешь по делу говорить.
Ошибка если не понятно в сформированном запросе, возможно где то нужен перенос строки, возможно не нужен, возможно нужно заголовок какой то установить - я не знаю.
На сервере в обработчик пустой массив файлов прилетает, тело запроса не верное.
   Cyberhawk
 
3 - 01.11.19 - 08:44
После разделителя должны не сами данные идти, а еще пара заголовков
   Cyberhawk
 
4 - 01.11.19 - 08:47
А вот тут
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
должны быть символы ==
   Cyberhawk
 
5 - 01.11.19 - 08:49
Но помню что е*отня тоже была, пока методом тыка не подошло.
Если брать за основу работающий пример то уже все легко потом.
   Сияющий в темноте
 
6 - 01.11.19 - 08:49
во первых
перевод строки
символы.вк + символы.пс
во вторых,перед каждым блоком указывается его тип и длина блока.
   ДенисЧ
 
7 - 01.11.19 - 08:51
(2) "На сервере в обработчик пустой массив файлов прилетает"

Мы должны были это угадать?
   Cyberhawk
 
8 - 01.11.19 - 08:54
Ну и Content-Length никогда не нужно задавать
   Cyberhawk
 
9 - 01.11.19 - 08:56
(3) + после них пустая строка
   dmt
 
10 - 01.11.19 - 08:58
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=""document""; filename=""%1.pdf""", ?(ПустаяСтрока(ИмяФайла), "document_" + Строка(Новый УникальныйИдентификатор()), ИмяФайла)));
    ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");
    ЗаписьДанных.ЗаписатьСтроку("");
   BayunTheCat
 
11 - 01.11.19 - 09:15
(8) Помогло убрать Content-Length, больше ничего не менял
   Cyberhawk
 
12 - 01.11.19 - 09:16
(11) Отчет меня уже не особо интересует

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.