Имя: Пароль:
1C
1С v8
Проблема с отправкой HTTP POST multipart/from-data
0 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
Судя по всему - в ДНК.
Ошибки не привёл, причин возникновения вопроса тоже...
2 BayunTheCat
 
01.11.19
07:02
Ты я вижу умеешь оскороблять людей, жаль не умеешь по делу говорить.
Ошибка если не понятно в сформированном запросе, возможно где то нужен перенос строки, возможно не нужен, возможно нужно заголовок какой то установить - я не знаю.
На сервере в обработчик пустой массив файлов прилетает, тело запроса не верное.
3 Cyberhawk
 
01.11.19
08:44
После разделителя должны не сами данные идти, а еще пара заголовков
4 Cyberhawk
 
01.11.19
08:47
А вот тут
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
должны быть символы ==
5 Cyberhawk
 
01.11.19
08:49
Но помню что е*отня тоже была, пока методом тыка не подошло.
Если брать за основу работающий пример то уже все легко потом.
6 Сияющий в темноте
 
01.11.19
08:49
во первых
перевод строки
символы.вк + символы.пс
во вторых,перед каждым блоком указывается его тип и длина блока.
7 ДенисЧ
 
01.11.19
08:51
(2) "На сервере в обработчик пустой массив файлов прилетает"

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