Передача изображения методом POST

1. user1201441 24.04.19 01:25 Сейчас в теме
Коллеги подскажите как правильно отправить изображение на сервер методом POST не кодируя в base64.
Проблема в том что файл приходит полу битый и частично открывается в веб приложении.
Алгоритм такой: я получаю двоичные данные по пути к изображению, затем читаю этот файл методом ПолучитьТекст()

Передача 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, ИмяВременногоФайла);

	Исключение
        Сообщить("Ошибка выполенния запроса!");
	КонецПопытки;
Показать
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
8. user1201441 24.04.19 21:44 Сейчас в теме
Вообщем вот рабочий вариант, может кому и пригодится.

//Вводные данные
Сервер = "Адрес сервера";
ИмяФайлаДляЗагрузки = "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Запрос);	
Исключение
//Обработка ответа
КонецПопытки;

Показать
ResAndDev; Nikola_N; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. spacecraft 24.04.19 08:57 Сейчас в теме
(1)
//Читаем содержимое файла источника данных и вставим данные в фаил отправки
ФайлДляПередачи = Новый ТекстовыйДокумент;
ФайлДляПередачи.Прочитать(Данные);

Читаете как текстовый документ, а не двоичные данные.
Используйте Новый ЧтениеДанных
2. buganov 200 24.04.19 04:58 Сейчас в теме
3. user1201441 24.04.19 07:58 Сейчас в теме
(2) не помогло, дело в том, что я передаю файл в том виде как если его открыть блокнотом, так вот если выгрузить с сервера битый файл который залился и сравнить с корректным то windiff показывает только различия в некоторых казалось бы идентичных строках. Скрин сравнения приложен к первому посту.
4. buganov 200 24.04.19 08:00 Сейчас в теме
(3)
Проверьте в hex-редакторе файл картинки и то, что передаете
5. user1201441 24.04.19 08:09 Сейчас в теме
(4) они разные в некоторых строках, поэтому фаил получается полу битый ,а понять почему пока не удалось
7. tvm 24.04.19 09:23 Сейчас в теме
(1)
  //Совокупность данных хранения и формирования файла который будет отправлен
    ТекстДляОтправки = "";
        ТекстДляОтправки = ТекстДляОтправки + "--"+Boundary+Символы.ПС;  

Вот здесь точно нужно добавлять Символы.ПС ?
вот тут есть пример. Похоже оттуда и взяли код
8. user1201441 24.04.19 21:44 Сейчас в теме
Вообщем вот рабочий вариант, может кому и пригодится.

//Вводные данные
Сервер = "Адрес сервера";
ИмяФайлаДляЗагрузки = "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Запрос);	
Исключение
//Обработка ответа
КонецПопытки;

Показать
ResAndDev; Nikola_N; +2 Ответить
9. Tanis 05.05.20 23:37 Сейчас в теме
Доброе время!

Не совсем понял, что подразумевается под параметром?

Спасибо!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот