1С отправка POST запроса с телом base64строка

Всем Привет.

Возникла проблема с передачей изображения на веб сервер из программы 1С 8.2.
Текстовые данные отлично передаются кроме изображения.
Делаю так :

ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
СерверПриемник = "port.rrham.com";
НТТР = Новый HTTPСоединение(СерверПриемник);

Файл = ("C:\img22.jpg");
ДД = Новый ДвоичныеДанные(Файл);
Строка64 = Base64Строка(ДД);

СтрокаPOSTЗапроса = "";
СтрокаPOSTЗапроса = СтрокаPOSTЗапроса + "&image=" + Строка64;

АдресСтраницы = "/data/api.php?call=add";
Попытка
ЗапросHTTP = Новый HTTPСоединение(АдресСтраницы, ЗаголовокHTTP);
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаPOSTЗапроса);
ОтветHTTP = НТТР.ОтправитьДляОбработки(ЗапросHTTP);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;  

А на сервере всё как обычно

 function add($image){
 ....
 $file = $_FILES['image']['name'];
 $path = '../data/'.$upload_image.'.jpg';
 ....
 file_put_contents($path,base64_decode($image));}   

Но в итоге я получаю ломанное изображение. Я пробовал сохранить сохранить $upload_image.'.jpg'; в txt текстовом формате и заметил что в кодировке отсутствуют некоторые спец символы к примеру + , перед отправкой символ плюс был а на сервере они отсутствуют вместо них просто пробелы.

Отрывок для примера
Символ плюс есть RgZ+msnCHzc126J8Q3Rt791bbe8HPBrLcGr9Njoa4jbUaX2ns8ecOdDiV4/hevTj
Символ плюс отсутствует RgZ msnCHzc126J8Q3Rt791bbe8HPBrLcGr9Njoa4jbUaX2ns8ecOdDiV4/hevTj

Подскажите , что я делаю не так?


Ответы (2 шт):

Автор решения: Klepov Yura

в 1с закодируй переменную Строка64 с помощью метода глобального контекста "КодироватьСтроку" и дальше делай как ты написал выше, например:

ДД = Новый ДвоичныеДанные(Файл);
Строка64 = Base64Строка(ДД);

**Строка64 = КодироватьСтроку(Строка64, СпособКодированияСтроки.КодировкаURL);**

Если данное решение помогло, то не забудь его отметить галочкой, спасибо

→ Ссылка
Автор решения: Klepov Yura

попробуй отправлять данные через multipart/form-data, у меня так работает, пример:

Процедура кОтправитьДанные(Команда)
    АдресСтраницы = "/data/api.php?call=add";
    Хост = "port.rrham.com";
    
    Файл = ("C:\img22.jpg");
    ДД = Новый ДвоичныеДанные(Файл);
    Строка64 = Base64Строка(ДД);
    
    // подготовим файл с данными для отправки
    имяФайлаОтправки = ПолучитьимяВременногоФайла("txt");
    boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
     
    ЗаписьТекста = Новый ЗаписьТекста(имяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, Ложь);
     
    // ++ поле формы html
    ЗаписьТекста.ЗаписатьСтроку("--" + boundary);
    ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""image""" + Символы.ПС);
    ЗаписьТекста.ЗаписатьСтроку("");
    ЗаписьТекста.ЗаписатьСтроку(Строка64);
    // -- поле формы html
    
    
    // закроем разделитель
    ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--");
    ЗаписьТекста.Закрыть();
    
    // определим размер файла
    ФайлОтправки = Новый Файл(имяФайлаОтправки);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    
    // передадим данные на сервер 
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "multipart/form-data, boundary=" + boundary);
    Заголовки.Вставить("Content-Lenght", РазмерФайлаОтправки);
    
    имяВыходногоФайла = ПолучитьИмяВременногоФайла("txt");
    
    ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницы, Заголовки);
    ЗапросHTTP.УстановитьИмяФайлаТела(имяФайлаОтправки);
    
    Соединение = Новый HTTPСоединение(Хост);
    Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
    
КонецПроцедуры
→ Ссылка