Передача изображения методом POST
Коллеги подскажите как правильно отправить изображение на сервер методом POST не кодируя в base64.
Проблема в том что файл приходит полу битый и частично открывается в веб приложении.
Алгоритм такой: я получаю двоичные данные по пути к изображению, затем читаю этот файл методом ПолучитьТекст()
Передача multipart сообщения происходит, сервер отвечает успехом, но открыв в веб приложении этот файл он кажется битым хоть и открывается.
По логам запрос идентичен POSTMAN с которым не возникает проблем, но если сравнить в windiff битый файл и нормальный, то есть различия, прошу помощи, в чем есть особенность, готов материально мотивировать.
Проблема в том что файл приходит полу битый и частично открывается в веб приложении.
Алгоритм такой: я получаю двоичные данные по пути к изображению, затем читаю этот файл методом ПолучитьТекст()
Передача multipart сообщения происходит, сервер отвечает успехом, но открыв в веб приложении этот файл он кажется битым хоть и открывается.
По логам запрос идентичен POSTMAN с которым не возникает проблем, но если сравнить в windiff битый файл и нормальный, то есть различия, прошу помощи, в чем есть особенность, готов материально мотивировать.
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
//Фаил который передаем на загрузку в
Данные = ПутьКXML;
//Разделитель
Boundary = "----"+Строка(Новый УникальныйИдентификатор());
//Формируем фрагмент файла POST-запроса
ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки,КодировкаТекста.ANSI);
//Совокупность данных хранения и формирования файла который будет отправлен
ТекстДляОтправки = "";
ТекстДляОтправки = ТекстДляОтправки + "--"+Boundary+Символы.ПС;
// Выберем из параметров ключ
Для Каждого ТекПараметр Из Параметры Цикл
ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name="""+ТекПараметр.ИмяПараметра+"""" +Символы.ПС+Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + ТекПараметр.ЗначениеПараметра + Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + "--"+Boundary+Символы.ПС;
КонецЦикла;
// Фаил
ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""file""; filename="""+ИмяФайла+""""+Символы.ПС;
Если РасширениеДокумента = "xml" тогда
ТекстДляОтправки = ТекстДляОтправки + "Content-Type: application/xml" +Символы.ПС+Символы.ПС;
Иначеесли РасширениеДокумента = "jpg" или РасширениеДокумента = "jpeg" тогда
ТекстДляОтправки = ТекстДляОтправки + "Content-Type: image/jpeg" +Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки + "Content-Transfer-Encoding: binary" +Символы.ПС+Символы.ПС;
Иначеесли РасширениеДокумента = "png" тогда
ТекстДляОтправки = ТекстДляОтправки + "Content-Type: image/png" +Символы.ПС+Символы.ПС;
Иначеесли РасширениеДокумента = "pdf" тогда
ТекстДляОтправки = ТекстДляОтправки + "Content-Type: application/pdf" +Символы.ПС+Символы.ПС;
конецесли;
//Читаем содержимое файла источника данных и вставим данные в фаил отправки
ФайлДляПередачи = Новый ТекстовыйДокумент;
ФайлДляПередачи.Прочитать(Данные);
если РасширениеДокумента = "jpg" или РасширениеДокумента = "jpeg" тогда
ТекстДляОтправки = ТекстДляОтправки + ФайлДляПередачи.ПолучитьТекст() ;
иначеесли РасширениеДокумента = "png" тогда
ТекстДляОтправки = ТекстДляОтправки + ФайлДляПередачи.ПолучитьТекст() ;
иначе
ТекстДляОтправки = ТекстДляОтправки + ФайлДляПередачи.ПолучитьТекст() + Символы.ПС;
конецесли;
ТекстДляОтправки = ТекстДляОтправки+Символы.ПС;
ТекстДляОтправки = ТекстДляОтправки+"--"+Boundary+"--";
//Запишем массив в фаил
ФайлОтправки.ЗаписатьСтроку(ТекстДляОтправки);
//Закроем фаил
ФайлОтправки.Закрыть();
//Заголовки
Заголовки = Новый Соответствие;
//Запрос
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса,Заголовки);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);
HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
HTTPЗапрос.Заголовки.Вставить("accept-encoding", "gzip, deflate");
HTTPЗапрос.Заголовки.Вставить("Accept", "*/*");
HTTPЗапрос.Заголовки.Вставить("cache-control", "no-cache");
HTTPЗапрос.Заголовки.Вставить("Connection", "close");
Если РасширениеДокумента = "xml" тогда
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
иначеесли РасширениеДокумента = "jpg" или РасширениеДокумента = "jpeg" тогда
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
иначеесли РасширениеДокумента = "png" тогда
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
иначеесли РасширениеДокумента = "pdf" тогда
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
конецесли;
//Параметры соединения
Таймаут = 500;
SSL = ?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
HTTPСоединение = Новый HTTPСоединение(АдресСервиса, , , , , Таймаут, SSL);
Попытка
ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ОбработатьИВывестиРезультат(ОтветHTTP, ИмяВременногоФайла);
Исключение
Сообщить("Ошибка выполенния запроса!");
КонецПопытки;
ПоказатьПрикрепленные файлы:
По теме из базы знаний
- Передача файлов и данных на веб-сервер средствами 1С:Предприятие 8.X методом POST
- Простой пример передачи данных между клиентом и сервером через HTTP-сервисы
- Создаем сайт ресторана на OneScript
- Программа для распознавания номеров автомобилей Vizavi Care
- Развертывание Docker с Flask + Tesseract и взаимодействие с 1С: Документооборот на примере версии 1.4
Найденные решения
Вообщем вот рабочий вариант, может кому и пригодится.
//Вводные данные
Сервер = "Адрес сервера";
ИмяФайлаДляЗагрузки = "XXX.jpg";
ИмяФайлаОтвета = "XXX.xml";
ИмяФайлаОтправки = КаталогВременныхФайлов() + "xxx.txt";
АдресРесурса = "Адрес сервиса";
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
Таймаут = 100;
SSL = ?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
Попытка
НТТР = Новый HTTPСоединение(Сервер, , , , , Таймаут, SSL);
Исключение
Сообщить("ОшибкаСоединения");
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Определяем массив для процедуры ОбъединитьФайлы
МассивФайловДляОбъединения = Новый Массив;
ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.UTF8, Символы.ПС, Ложь);
//Параметр1, аналогично для параметра 2 и более
ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary);
ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""Параметр1""");
ФайлОтправкиНачало.ЗаписатьСтроку("");
ФайлОтправкиНачало.ЗаписатьСтроку("Значение параметра");
ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary);
//Файл
ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""ИмяПараметра""; filename=""" + "ИмяФайла" + """");
ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: XXX"); где XXX - MIME types
ФайлОтправкиНачало.ЗаписатьСтроку("");
ФайлОтправкиНачало.Закрыть();
МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);
МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузки);
ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.UTF8, Символы.ПС, Ложь);
ФайлОтправкиКонец.ЗаписатьСтроку(Символы.ПС + "--" + Boundary + "--" + Символы.ПС);
ФайлОтправкиКонец.Закрыть();
МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);
ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
//Заголовки
Заголовки = Новый Соответствие;
//Запрос
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса,Заголовки);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);
HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
HTTPЗапрос.Заголовки.Вставить("accept-encoding", "gzip, deflate");
HTTPЗапрос.Заголовки.Вставить("cache-control", "no-cache");
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
Попытка
ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Исключение
//Обработка ответа
КонецПопытки;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Может быть статья разрешит проблему
http://v8.1c.ru/o7/201602bin/index.htm
https://infostart.ru/public/561328/
(2) не помогло, дело в том, что я передаю файл в том виде как если его открыть блокнотом, так вот если выгрузить с сервера битый файл который залился и сравнить с корректным то windiff показывает только различия в некоторых казалось бы идентичных строках. Скрин сравнения приложен к первому посту.
Вообщем вот рабочий вариант, может кому и пригодится.
//Вводные данные
Сервер = "Адрес сервера";
ИмяФайлаДляЗагрузки = "XXX.jpg";
ИмяФайлаОтвета = "XXX.xml";
ИмяФайлаОтправки = КаталогВременныхФайлов() + "xxx.txt";
АдресРесурса = "Адрес сервиса";
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
Таймаут = 100;
SSL = ?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
Попытка
НТТР = Новый HTTPСоединение(Сервер, , , , , Таймаут, SSL);
Исключение
Сообщить("ОшибкаСоединения");
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Определяем массив для процедуры ОбъединитьФайлы
МассивФайловДляОбъединения = Новый Массив;
ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.UTF8, Символы.ПС, Ложь);
//Параметр1, аналогично для параметра 2 и более
ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary);
ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""Параметр1""");
ФайлОтправкиНачало.ЗаписатьСтроку("");
ФайлОтправкиНачало.ЗаписатьСтроку("Значение параметра");
ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary);
//Файл
ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""ИмяПараметра""; filename=""" + "ИмяФайла" + """");
ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: XXX"); где XXX - MIME types
ФайлОтправкиНачало.ЗаписатьСтроку("");
ФайлОтправкиНачало.Закрыть();
МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);
МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузки);
ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.UTF8, Символы.ПС, Ложь);
ФайлОтправкиКонец.ЗаписатьСтроку(Символы.ПС + "--" + Boundary + "--" + Символы.ПС);
ФайлОтправкиКонец.Закрыть();
МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);
ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
//Заголовки
Заголовки = Новый Соответствие;
//Запрос
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса,Заголовки);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+Boundary);
HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
HTTPЗапрос.Заголовки.Вставить("accept-encoding", "gzip, deflate");
HTTPЗапрос.Заголовки.Вставить("cache-control", "no-cache");
HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
Попытка
ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Исключение
//Обработка ответа
КонецПопытки;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот