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 шт):
в 1с закодируй переменную Строка64 с помощью метода глобального контекста "КодироватьСтроку" и дальше делай как ты написал выше, например:
ДД = Новый ДвоичныеДанные(Файл);
Строка64 = Base64Строка(ДД);
**Строка64 = КодироватьСтроку(Строка64, СпособКодированияСтроки.КодировкаURL);**
Если данное решение помогло, то не забудь его отметить галочкой, спасибо
попробуй отправлять данные через 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);
КонецПроцедуры