1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-03-29 21:57:16 +02:00

PXY: Обработка Multipart

This commit is contained in:
Anton Titovets 2025-02-04 10:09:25 +03:00
parent fdf24eb9e3
commit 7af6951b79
2 changed files with 87 additions and 17 deletions

View File

@ -1197,8 +1197,16 @@
ЧтениеЧасти = Новый ЧтениеДанных(Поток);
ЗаголовкиЧасти = ПрочитатьЗаголовки(ЧтениеЧасти);
ИмяЧасти = ПолучитьИмяСообщения(ЗаголовкиЧасти);
ДанныеЧасти = ПолучитьИмяСообщения(ЗаголовкиЧасти);
ИмяЧасти = ДанныеЧасти["name"];
ИмяФайла = ДанныеЧасти["filename"];
ТекущиеДанные = ЧтениеЧасти.Прочитать().ПолучитьДвоичныеДанные();
Если Не ЗначениеЗаполнено(ИмяФайла) Тогда
ТекущиеДанные = ПолучитьСтрокуИзДвоичныхДанных(ТекущиеДанные);
КонецЕсли;
СоответствиеДанных.Вставить(ИмяЧасти, ТекущиеДанные);
@ -1272,8 +1280,9 @@
Функция ПолучитьИмяСообщения(Заголовки)
ТекстИсключения = "Content-Disposition одной из частей не найден или имеет неверный формат!";
Описание = Заголовки.Получить("Content-Disposition");
ТекстИсключения = "Content-Disposition одной из частей не найден или имеет неверный формат!";
Описание = Заголовки.Получить("Content-Disposition");
СтруктураВозврата = Новый Структура("name,filename");
Если Не ЗначениеЗаполнено(Описание) Тогда
ВызватьИсключение ТекстИсключения;
@ -1286,20 +1295,26 @@
Части = СтрРазделить(Свойство, "=", Ложь);
ИмяСвойства = СокрЛП(Части[0]);
ИмяСвойства = нРег(ИмяСвойства);
Если ИмяСвойства <> "name" И ИмяСвойства <> "Name" Тогда
Продолжить;
Если ИмяСвойства = "name" Тогда
СтруктураВозврата["name"] = СокрЛП(Части[1]);
ИначеЕсли ИмяСвойства = "filename"Тогда
СтруктураВозврата["filename"] = СокрЛП(Части[1]);
Иначе
Продолжить;
КонецЕсли;
Имя = СокрЛП(Части[1]);
Прервать;
КонецЦикла;
Если Не ЗначениеЗаполнено(Имя) Тогда
Если Не ЗначениеЗаполнено(СтруктураВозврата["name"]) Тогда
ВызватьИсключение ТекстИсключения;
Иначе
Возврат Имя;
Возврат СтруктураВозврата;
КонецЕсли;
КонецФункции

View File

@ -40,6 +40,8 @@
//@skip-check module-accessibility-at-client
//@skip-check object-module-export-variable
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ОписаниеПеременных
Перем ПутьПроекта Экспорт;
@ -52,7 +54,6 @@
Процедура ОсновнаяОбработка(Контекст, СледующийОбработчик) Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Попытка
Результат = ОбработатьЗапрос(Контекст);
@ -71,10 +72,6 @@
Контекст.Ответ.ТипКонтента = "application/json;charset=UTF8";
Контекст.Ответ.Записать(JSON);
#Иначе
ВызватьИсключение "Метод недоступен на клиенте!";
#КонецЕсли
КонецПроцедуры
Функция ОбработатьЗапрос(Контекст)
@ -122,6 +119,10 @@
ИначеЕсли МетодОбработчика = "POST" Тогда
Результат = ВыполнитьОбработкуPost(Контекст, Обработчик);
ИначеЕсли МетодОбработчика = "MULTIPART" Тогда
Результат = ВыполнитьОбработкуMultipart(Контекст, Обработчик);
Иначе
@ -157,13 +158,50 @@
КонецФункции
Функция ВыполнитьОбработкуMultipart(Контекст, Обработчик)
Запрос = Контекст.Запрос;
Тело = Запрос.Тело;
Заголовки = Запрос.Заголовки;
Параметры = OPI_Инструменты.РазобратьMultipart(Тело, Заголовки);
Возврат ВыполнитьУниверсальнуюОбработку(Контекст, Обработчик, Параметры);
КонецФункции
Функция ВыполнитьУниверсальнуюОбработку(Контекст, Обработчик, Параметры)
Аргументы = Обработчик["args"];
Команда = Обработчик["library"];
Метод = Обработчик["function"];
МассивВФ = Новый Массив;
КотелПараметров = СформироватьКотелПараметров(Аргументы, Параметры);
Для Каждого Параметр Из КотелПараметров Цикл
ТекущееЗначение = Параметр.Значение;
ТекущийКлюч = Параметр.Ключ;
Если ТипЗнч(ТекущееЗначение) = Тип("ДвоичныеДанные") Тогда
//@skip-check missing-temporary-file-deletion
ИВФ = ПолучитьИмяВременногоФайла();
ТекущееЗначение.Записать(ИВФ);
МассивВФ.Добавить(ИВФ);
КотелПараметров.Вставить(ТекущийКлюч, ИВФ);
Иначе
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекущееЗначение);
КотелПараметров.Вставить(ТекущееЗначение, ИВФ);
КонецЕсли;
КонецЦикла;
СтруктураВыполнения = ОбъектОПИ.СформироватьСтрокуВызоваМетода(КотелПараметров, Команда, Метод);
Ответ = Неопределено;
@ -180,6 +218,16 @@
Ответ = Новый Структура("result,data", Истина, Ответ);
КонецЕсли;
Попытка
Для Каждого ВременныйФайл Из МассивВФ Цикл
УдалитьФайлы(ВременныйФайл);
КонецЦикла;
Исключение
Сообщить("Не удалось удалить временные файлы!");
КонецПопытки;
Возврат Ответ;
@ -210,8 +258,11 @@
Для Каждого Параметр Из Параметры Цикл
Значение = Параметр.Значение;
Значение = ?(СтрНачинаетсяС(Значение , """"), Прав(Значение, СтрДлина(Значение) - 1), Значение);
Значение = ?(СтрЗаканчиваетсяНа(Значение, """"), Лев(Значение , СтрДлина(Значение) - 1), Значение);
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Значение = ?(СтрНачинаетсяС(Значение , """"), Прав(Значение, СтрДлина(Значение) - 1), Значение);
Значение = ?(СтрЗаканчиваетсяНа(Значение, """"), Лев(Значение , СтрДлина(Значение) - 1), Значение);
КонецЕсли;
КотелПараметров.Вставить("--" + Параметр.Ключ, Значение);
@ -234,3 +285,7 @@
КонецФункции
#КонецОбласти
#Иначе
ВызватьИсключение "Объект недоступен на клиенте!";
#КонецЕсли