Передача и получение файла post запросом

1. user1619761 13.12.24 13:36 Сейчас в теме
Добрый день. Передаю через http сервис png изображение, в базе, куда передаю файл, Запрос.ПолучитьТелоКакСтроку() = "--aad02f12bf374e5ca34ae62b210cafd7
Content-Disposition: form-data; name="image"


/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAcHBwcIBwgJCQgMDAsMDBEQDg4Q­ERoS
FBIUEhonGB0YGB0YJyMqIiAiKiM+MSsrMT5IPDk8SFdOTldtaG2Pj8ABBwcH­BwgH
CAkJCAwMCwwMERAODhARGhIUEhQSGicYHRgYHRgnIyoiICIqIz4xKysxPkg8­OTxIe1z/9k=
--aad02f12bf374e5ca34ae62b210cafd7--
". Подскажите, пожалуйста, как получить файл в базе, к которой делается запрос? Код формирования запроса
Хост = "localhost";
	ИмяМетода = "/my_publication/hs/exchange/PostFile/";
	Соединение = Новый HTTPСоединение(Хост, ,Пользователь, Пароль);
        ИмяФайла = "C:\test.jpeg";
ДД = Новый ДвоичныеДанные(ИмяФайла);
    Строка64 = Base64Строка(ДД);
    имяФайлаОтправки = ПолучитьимяВременногоФайла("txt");
    boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
     
    ЗаписьТекста = Новый ЗаписьТекста(имяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, Ложь);
    ЗаписьТекста.ЗаписатьСтроку("--" + boundary);
    ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""image""" + Символы.ПС);
    ЗаписьТекста.ЗаписатьСтроку("");
    ЗаписьТекста.ЗаписатьСтроку(Строка64);
    
    
    ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--");
    ЗаписьТекста.Закрыть();
    
    ФайлОтправки = Новый Файл(имяФайлаОтправки);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "multipart/form-data, boundary=" + boundary);
    Заголовки.Вставить("Content-Lenght", РазмерФайлаОтправки);
        
    ЗапросHTTP = Новый HTTPЗапрос(ИмяМетода, Заголовки);
    ЗапросHTTP.УстановитьИмяФайлаТела(имяФайлаОтправки);
    
    Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1936660 13.12.24 13:47 Сейчас в теме
Передавать тело файла в теле запроса иcпользуя Content-Type: application/octet-stream и не парить никому мозг своими boundary. Тем более ты в них ничего не понимаешь.
3. user1619761 13.12.24 14:02 Сейчас в теме
(2) так я разобраться и хочу, я ж не прошу готовый код скинуть, мне статьи какие-нибудь полезные, где можно почитать подробно все, все что я смог найти так это отправка файлов через http, про получение данных на стороне другой базы я ничего не нашел. Возможно плохо искал
4. Sashares 35 13.12.24 14:20 Сейчас в теме
(3) Взять из ответа строку
/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAcHBwcIBwgJCQgMDAsMDBEQDg4Q­­ERoS
FBIUEhonGB0YGB0YJyMqIiAiKiM+MSsrMT5IPDk8SFdOTldtaG2Pj8ABBwcH­­BwgH
CAkJCAwMCwwMERAODhARGhIUEhQSGicYHRgYHRgnIyoiICIqIz4xKysxPkg8­­OTxIe1z/9k=

Методом Base64Значение() от этой строки у тебя будут ДвоичныеДанные картинки.
user1619761; +1 Ответить
5. user1619761 13.12.24 15:59 Сейчас в теме
(4) у меня с этим и есть проблема,
BoundaryМассив = СтрРазделить(Запрос.Заголовки["Content-Type"], "=");
	BoundaryЗначение = BoundaryМассив[BoundaryМассив.ВГраница()]; 
	СтрокаBase64 = СтрЗаменить(Запрос.ПолучитьТелоКакСтроку(), "--" + BoundaryЗначение + "--", "");
	СтрокаBase64 = СтрЗаменить(СтрокаBase64, "--" + BoundaryЗначение, "");
	СтрокаBase64 = СтрЗаменить(СтрокаBase64, "Content-Disposition: form-data; name=""image""", "");
	НомерСимвола = 1;
	Пока Истина Цикл
		ЗначениеСимвола = Сред(СтрокаBase64, НомерСимвола, 1);
		Если ЗначениеЗаполнено(ЗначениеСимвола) Тогда
			Прервать;
		Иначе     
			СтрокаBase64 = Прав(СтрокаBase64, СтрДлина(СтрокаBase64) - 1);
		КонецЕсли;
	КонецЦикла;
	НомерСимвола = СтрДлина(СтрокаBase64);
	Пока Истина Цикл
		ЗначениеСимвола = Сред(СтрокаBase64, НомерСимвола, 1);
		Если ЗначениеЗаполнено(ЗначениеСимвола) Тогда
			Прервать;
		Иначе     
			СтрокаBase64 = Лев(СтрокаBase64, СтрДлина(СтрокаBase64) - 1);
		КонецЕсли;
		НомерСимвола = СтрДлина(СтрокаBase64);
	КонецЦикла;
Показать
при Base64Значение(СтрокаBase64) двоичные данные пустые
6. Sashares 35 13.12.24 16:26 Сейчас в теме
(5) В формате base64 в конце должно быть 2 символа =, у вас он один.
Смотрите что формируется на этом этапе:

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


Возможно приходит вам не то, что-то.
7. user1619761 13.12.24 17:01 Сейчас в теме
(6)
Смотрите что формируется на этом этапе:
в конце так же один символ =
exgVDuwessk+AnabcACWfBvQQ0DcUHEBqXWZn0+mhtsgHn9ICbhzDVdPCvqPjzK6
wk1GrxMJNQ+kRe1z/9k=
в этом же коде если вызываю метод
ДД = Новый ДвоичныеДанные(ИмяФайла);
Строка64 = Base64Строка(ДД);
ДД = Base64Значение(Строка64 );
то двоичные данные нормальные
8. Sashares 35 13.12.24 17:08 Сейчас в теме
(7) Был не прав. Может быть 1 символ равно.
Тогда стоит проверить, что то что отправляется соответствует тому что приходит.
Приведенная в 7 строка преобразуется в двоичные данные, а строка из шапки - нет.
Оставьте свое сообщение

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