Загрузка файлов на сервер с использованием HTTP-сервиса 1С (multipart/form-data).

12.08.20

Интеграция - WEB-интеграция

Вариант загрузки файлов в составных данных методом POST (multipart/form-data) на примере демонстрационной базы.

Скачать исходный код

Наименование Файл Версия Размер
Демонстрационная база загрузки файлов с использованием HTTP-сервиса
.zip 21,79Kb
32
.zip 21,79Kb 32 Скачать

Предположим, что есть сайт (HTML-страница) с формой, в которой пользователь должен заполнить некие поля, прикрепить файл и отправить все эти данные на сервер, чтобы сохранить их в базе 1С, где-то на диске или просто обработать по какому-либо алгоритму. Например, прикрепить скан паспорта в личном кабинете или скриншот при описании своей проблемы с программой и т.п.

Для отправки HTML-форм с двоичными данными методом POST используется составной тип содержимого multipart/form-data.

Получение таких данных HTTP-сервисом 1С реализовано на примере демонстрационной базы. В базе присутствует справочник Пользователи, содержащий имя пользователя, адрес его электронной почты и фотографию. А так же HTTP-сервис для регистрации новых пользователей.

Реализована простейшая HTML-страница регистрации пользователя на сайте.

 
 Код HTML-страницы

После нажатия на кнопку Выполнить регистрацию в демонстрационной базе создаётся новый элемент справочника Пользователи, содержащий указанные данные.

Тело передаваемого POST запроса будет выглядеть следующим образом.

POST /form.html HTTP/1.1
Host: server.com
Referer: http://server.com/form.html
User-Agent: Mozilla
Content-Type: multipart/form-data; boundary=-------------573cf973d5228
Content-Length: 288
Connection: keep-alive
Keep-Alive: 300
(пустая строка)
(отсутствующая преамбула)
---------------573cf973d5228
Content-Disposition: form-data; name="email"

phill@bestcompany.com
---------------573cf973d5228 
Content-Disposition: form-data; name="name" 

Филиппов Артем Леонидович
---------------573cf973d5228
Content-Disposition: form-data; name="photo"; filename="photo.png"
Content-Type: image/png

<Двоичные данные изображения>
---------------573cf973d5228--

Подробно этот метод описан в RFC7578.

Функции по обработке HTTP-запроса с составным содержимым реализованы в общем модуле ОбработкаЗапросовHTTPСервиса. Его можно использовать "как есть" в своих конфигурациях.

Процедура обработчика HTTP-сервиса по регистрации нового пользователя может выглядеть подобным образом.

Функция ЗарегистрироватьНовогоПользователя(Запрос)
	
	ПоляЗапроса = ОбработкаЗапросовHTTPСервиса.ПрочитатьСоставноеСодержимоеЗапроса(Запрос);
	
	// Для простоты демонстрации не выполняется проверка корректности заполнения полей запроса.
	
	ДанныеПользователя = Новый Структура;
	ДанныеПользователя.Вставить("АдресЭлектроннойПочты", ПоляЗапроса["email"].Содержимое);
	ДанныеПользователя.Вставить("ИмяПользователя", ПоляЗапроса["user_name"].Содержимое);
	ДанныеПользователя.Вставить("Фотография", ПоляЗапроса["photo"].Содержимое);
	
	Пользователи.ЗарегистрироватьПользователя(ДанныеПользователя);
	
	Ответ = Новый HTTPСервисОтвет(200);
	Возврат Ответ;
	
КонецФункции
 
 Код процедуры "ЗарегистрироватьПользователя" общего модуля "Пользователи"

Функция ПрочитатьСоставноеСодержимоеЗапроса разбирает полученный запрос и возвращает Соответствие, содержащее переданные поля с их содержимым.

 
 Описание функции "ПрочитатьСоставноеСодержимоеЗапроса"

 Синтаксис:

ПрочитатьСоставноеСодержимоеЗапроса(<Запрос>)

Параметры:

<Запрос> (обязательный)
Тип: HTTPСервисЗапрос
Запрос, полученный HTTP-сервисом.

Возвращаемое значение:

Тип: Соответствие
Соответствие, содержащее описание полей составного содержимого. В качестве ключа используется имя поля. Значение содержит структуру с описанием поля:

  • Имя - Строка - имя поля (свойство name заголовка Content-Disposition).
  • ИмяФайла - Строка - имя файла (свойство filename заголовка Content-Disposition). Если имя файла указано, то содержимое является двоичными данными.
  • ТипСодержимого - Строка - тип содержимого, указанный в заголовке Content-Type поля. Например: text/plain, image/jpeg и т.п. Может отсутствовать.
  • Содержимое - Строка, ДвоичныеДанные - содержимое поля. Если указано имя файла, то содержит двоичные данные, иначе Строка.

Описание:

Читает тело запроса HTTP-сервиса, имеющее составное содержимое (multipart/form-data) и возвращает поля этого содержимого в виде соответствия. В качестве ключа используется имя поля.

В архиве к публикации содержится cf-файл демонстрационной конфигурации и html-страница регистрации пользователя. Также, ниже приведён полный текст общего модуля ОбработкаЗапросовHTTPСервиса, который можно вставить в свою конфигурацию.

 
 Полный текст общего модуля "ОбработкаЗапросовHTTPСервиса"

Исходный код распространяется под лицензий Apache 2.0. Вы можете свободно использовать, изменять и распространять его, в том числе и в коммерческих целях с обязательным указанием авторства. Подробнее см. текст лицензии http://www.apache.org/licenses/LICENSE-2.0

загрузка http post multpart/form-data

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    16162    13    18    

13

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    18267    10    15    

16

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13030    34    8    

13

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    85539    26    51    

50

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16673    43    49    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 12.08.20 12:10
3. ltfriend 964 12.08.20 20:47 Сейчас в теме
2. malikov_pro 1299 12.08.20 12:52 Сейчас в теме
В чем новизна относительно https://infostart.ru/public/20017/?
Если реализовано в виде расширения которое можно относительно просто переиспользовать, то хорошо. В качестве основы можно использовать демо БСП.
4. SizovE 263 17.08.20 12:05 Сейчас в теме
Я так понимаю, там была отправка, а тут загрука. 1С не умеет работать с formdata.
Полезная штука.
5. Konstantine26 20.01.21 09:51 Сейчас в теме
Пользовался данным кодом, но столкнулся с загрузкой нескольких файлов в одном решил проблему следующим образом, может кому то будет полезно:
// Выполняет чтение тела запроса HTTP-сервиса, имеющее составное содержимое (multipart/form-data) и возвращает поля
// этого содержимого в виде соответствия. В качестве ключа используется имя поля.
//
// Параметры:
//  Запрос - HTTPСервисЗапрос - запрос, полученный HTTP-сервисом.
// 
// Возвращаемое значение:
//  Соответствие - соответствие, содержащее описание полей составного содержимого. В качестве ключа используется имя
//                 поля. Значение содержит структуру с описанием поля. Подробнее см. ПолеСоставногоСодержимогоЗапроса.
//
Функция ПрочитатьСоставноеСодержимоеЗапроса(Запрос) Экспорт
	
	ПоляЗапроса = Новый Соответствие;
	
	РазделительПолей = ПолучитьРазделитьПолейСоставногоСодержимого(Запрос);	
	ОкончаниеПолей = "--";
	
	ТелоЗапроса = Запрос.ПолучитьТелоКакПоток();
	ЧтениеДанных = Новый ЧтениеДанных(ТелоЗапроса);
	
	ЕстьДанные = Истина;
	Пока ЕстьДанные Цикл
		
		РезультатЧтения = ЧтениеДанных.ПрочитатьДо(РазделительПолей);
		ЕстьДанные = РезультатЧтения.МаркерНайден;
		
		Если ЕстьДанные Тогда
			Строка = ЧтениеДанных.ПрочитатьСтроку();
			ЕстьДанные = (Строка <> ОкончаниеПолей);
		КонецЕсли; 
		
		Если РезультатЧтения.Размер = 0 Тогда
			Продолжить;
		КонецЕсли; 
		
		Поток = РезультатЧтения.ОткрытьПотокДляЧтения();
		
		Поле = ПрочитатьПолеСоставногоСодержимогоИзПотока(Поток);
		//Дописание
		НайденоеПоле = ПоляЗапроса.Получить(Поле.Имя); 
		
		Если НайденоеПоле = Неопределено Тогда
			ПоляЗапроса.Вставить(Поле.Имя, Поле);
		Иначе
			Если ТипЗнч(НайденоеПоле) = Тип("Структура") Тогда 
				МассивСтруктур = Новый Массив;
				МассивСтруктур.Добавить(НайденоеПоле);
				МассивСтруктур.Добавить(Поле);
				ПоляЗапроса.Удалить(Поле.Имя);
				ПоляЗапроса.Вставить(Поле.Имя,МассивСтруктур);
			ИначеЕсли  ТипЗнч(НайденоеПоле) = Тип("Массив") Тогда
				ПоляЗапроса.Получить(Поле.Имя).Добавить(Поле);
			КонецЕсли;
		КонецЕсли;
		//Дописание
		Поток.Закрыть();
		
	КонецЦикла; 
	
	ЧтениеДанных.Закрыть();
	ТелоЗапроса.Закрыть();
	
	Возврат ПоляЗапроса;
	
КонецФункции 
Показать
6. quazare 3653 02.06.22 13:48 Сейчас в теме
полезная штука - спасибо!
7. WKBAPKA 214 22.03.23 17:42 Сейчас в теме
Огромное спасибо!
Сколько я всего перелопатил, сколько примеров пересмотрел
Ничего не работает!
Оставьте свое сообщение