Skip to content

Commit dc41f1b

Browse files
committed
feat: Отображение нетекстовых двоичных данных в формате data URI
1 parent 62330aa commit dc41f1b

File tree

2 files changed

+82
-11
lines changed

2 files changed

+82
-11
lines changed

src/internal/Классы/ПомощникПодготовкиОтветов.os

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@
347347
КонецЕсли;
348348

349349
Для Индекс = 0 По ДанныеФормы.Количество() - 1 Цикл
350+
350351
Строка = ДанныеФормы.ПолучитьПоИндексу(Индекс);
351352

352353
Если ЭтоНативныйВебСервер Тогда
@@ -377,14 +378,31 @@
377378
КонецЕсли;
378379

379380
Значение = Неопределено;
380-
Если Не Строка.Значение = Неопределено Тогда
381-
Значение = ПолучитьСтрокуИзДвоичныхДанных(Строка.Значение);
382-
КонецЕсли;
383381

384382
Если ИмяФайла = Неопределено Тогда
383+
385384
Контейнер = Результат.Данные;
385+
386+
Если Не Строка.Значение = Неопределено Тогда
387+
Значение = ПолучитьСтрокуИзДвоичныхДанных(Строка.Значение, КодировкаТекста.UTF8);
388+
КонецЕсли;
389+
386390
Иначе
391+
387392
Контейнер = Результат.Файлы;
393+
394+
Заголовки = Строка.Метаданные["Заголовки"];
395+
Если Не Заголовки = Неопределено Тогда
396+
ТипКонтента = ЗначениеЗаголовка(Заголовки, "Content-Type");
397+
Иначе
398+
ТипКонтента = Неопределено;
399+
КонецЕсли;
400+
401+
Если Не Строка.Значение = Неопределено Тогда
402+
ТипКонтента = ?(ТипКонтента = Неопределено, "application/octet-stream", ТипКонтента);
403+
Значение = ТекстовоеПредставлениеДвоичныхДанных(Строка.Значение, ТипКонтента);
404+
КонецЕсли;
405+
388406
КонецЕсли;
389407

390408
НайденноеЗначение = Контейнер[Имя];
@@ -397,13 +415,50 @@
397415
МассивЗначений.Добавить(НайденноеЗначение);
398416
МассивЗначений.Добавить(Значение);
399417
Контейнер.Вставить(Имя, МассивЗначений);
400-
КонецЕсли;
418+
КонецЕсли;
419+
401420
КонецЦикла;
402421

403422
Возврат Результат;
404423

405424
КонецФункции
406425

426+
Функция ТекстовоеПредставлениеДвоичныхДанных(ДвоичныеДанные, ТипКонтента)
427+
428+
Если ДвоичныеДанныеСодержатУправляющиеСимволы(ДвоичныеДанные) Тогда
429+
430+
Возврат СтрШаблон("data:%1;base64,%2", ТипКонтента, Base64Строка(ДвоичныеДанные));
431+
432+
Иначе
433+
434+
Возврат ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8);
435+
436+
КонецЕсли;
437+
438+
КонецФункции
439+
440+
Функция ДвоичныеДанныеСодержатУправляющиеСимволы(ДвоичныеДанные)
441+
442+
ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
443+
444+
Пока Истина Цикл
445+
446+
Если ЧтениеДанных.ЧтениеЗавершено Тогда
447+
Прервать;
448+
КонецЕсли;
449+
450+
Байт = ЧтениеДанных.ПрочитатьБайт();
451+
452+
Если Байт > 0 И Байт < 8 Или Байт > 13 И Байт < 26 Тогда
453+
Возврат Истина;
454+
КонецЕсли;
455+
456+
КонецЦикла;
457+
458+
Возврат Ложь;
459+
460+
КонецФункции
461+
407462
Функция ЗаголовкиДляJson(Заголовки) Экспорт
408463

409464
Если ЭтоНативныйВебСервер Тогда

tests/HttpBin_API_test.os

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,21 @@
257257
Данные.Вставить("Name", "Jack");
258258

259259
Файлы = Новый Массив();
260-
Файлы.Добавить(Новый Структура("Имя, Данные, ИмяФайла, Тип",
261-
"File",
262-
ПолучитьДвоичныеДанныеИзСтроки("HTTPBIN"),
263-
"httpbin.txt",
264-
"text/plain"));
265-
260+
261+
Файл = Новый Структура();
262+
Файл.Вставить("Имя", "Text");
263+
Файл.Вставить("Данные", ПолучитьДвоичныеДанныеИзСтроки("HTTPBIN"));
264+
Файл.Вставить("ИмяФайла", "httpbin.txt");
265+
Файл.Вставить("Тип", "text/plain");
266+
Файлы.Добавить(Файл);
267+
268+
Файл = Новый Структура();
269+
Файл.Вставить("Имя", "Binary");
270+
Файл.Вставить("Данные", Base64Значение(Base64ZipФайла()));
271+
Файл.Вставить("ИмяФайла", "httpbin.zip");
272+
Файл.Вставить("Тип", "application/octet-stream");
273+
Файлы.Добавить(Файл);
274+
266275
ПараметрыКоннектора = ПараметрыКоннектора();
267276
ПараметрыКоннектора.Вставить("Файлы", Файлы);
268277

@@ -272,7 +281,10 @@
272281
Ожидаем.Что(Ответ.КодСостояния).Равно(200);
273282
Ожидаем.Что(Ответ.Заголовки["Content-Type"]).Равно("application/json");
274283
Ожидаем.Что(Результат["form"]["Name"]).Равно("Jack");
275-
Ожидаем.Что(Результат["files"]["File"]).Равно("HTTPBIN");
284+
Ожидаем.Что(Результат["files"]["Text"]).Равно("HTTPBIN");
285+
286+
ДанныеВDataURI = СтрШаблон("data:application/octet-stream;base64,%1", Base64ZipФайла());
287+
Ожидаем.Что(Результат["files"]["Binary"]).Равно(ДанныеВDataURI);
276288

277289
КонецПроцедуры
278290

@@ -1056,4 +1068,8 @@
10561068
КонецЕсли;
10571069

10581070
Возврат ПараметрыКоннектора;
1071+
КонецФункции
1072+
1073+
Функция Base64ZipФайла()
1074+
Возврат "UEsDBAoAAAAAAEAIalpdCci4BwAAAAcAAAALAAAAaHR0cGJpbi50eHRIVFRQQklOUEsBAh8ACgAAAAAAQAhqWl0JyLgHAAAABwAAAAsAJAAAAAAAAAAgAAAAAAAAAGh0dHBiaW4udHh0CgAgAAAAAAABABgAYXX04T6R2wFhdfThPpHbAdjuOJY+kdsBUEsFBgAAAAABAAEAXQAAADAAAAAAAA==";
10591075
КонецФункции

0 commit comments

Comments
 (0)