Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Передача и получение одного файла с сервера
Дальше: Получение нескольких файлов с сервера

Передача нескольких файлов на сервер

Предположим, у нас на локальном диске есть файлы изображений с картинками товаров и нам нужно поместить эти картинки в виде двоичных данных в справочник товаров. Будем считать, что для соотнесения файла картинки и товара имена файлов должны совпадать с наименованиями товаров.

Для решения этой задачи добавим команду УстановитьКартинкиТоваров. Обработчик команды заполним следующим образом (листинг 6.22).

Листинг 6.22. Обработчик команды «УстановитьКартинкиТоваров»

&НаКлиенте

Процедура УстановитьКартинкиТоваров(Команда)

 

ОповещениеОЗавершении = Новый ОписаниеОповещения("УстановитьКартинкиТоваровЗавершение", ЭтотОбъект);

 

//СтрокаПоиска = "e:\pictures\*.jpg";

//НачатьПомещениеФайловНаСервер(ОповещениеОЗавершении, , , СтрокаПоиска, УникальныйИдентификатор);

 

ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Выберите файлы картинок", Истина, "*.jpg");

НачатьПомещениеФайловНаСервер(ОповещениеОЗавершении, , , ПараметрыДиалога, УникальныйИдентификатор);

 

//ОповещениеОХодеВыполнения = Новый ОписаниеОповещения("УстановитьКартинкиТоваровХодВыполнения", ЭтотОбъект);

//НачатьПомещениеФайловНаСервер(ОповещениеОЗавершении, ОповещениеОХодеВыполнения, , ПараметрыДиалога,

// УникальныйИдентификатор);

 

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

В этом обработчике сначала мы создаем описание оповещения, указывающее на экспортную процедуру УстановитьКартинкиТоваровЗавершение(), которая будет выполнена, после того как все файлы картинок будут помещены во временное хранилище (листинг 6.23).

Затем мы создаем объект ПараметрыДиалогаПомещенияФайлов и задаем заголовок, возможность множественного выбора файлов и строку фильтра файлов (в нашем случае "*.jpg"), отображаемых для выбора в диалоге. В общем случае можно задать несколько вариантов фильтра (например: «Текстовый документ(*.txt)|*.txt;*rtf |Табличный документ(*.mxl)|*.mxl»), а при отображении диалога выбрать нужный фильтр.

И передаем описание оповещения о завершении и параметры диалога помещения файлов в метод глобального контекста НачатьПомещениеФайловНаСервер(), с помощью которого начинается помещение файлов с картинками товаров из локальной файловой системы во временное хранилище. При этом пользователю показывается диалог выбора файлов, соответствующих заданному фильтру.

Можно также использовать вариант вызова этого метода с указанием в четвертом параметре строки поиска файлов вместо диалога (см. закомментированный фрагмент кода), но следует иметь в виду, что для работы этого метода в веб-клиенте потребуется установить расширение для работы с файлами. В то время как в первом случае это расширение не требуется.

Листинг 6.23. Процедура «УстановитьКартинкиТоваровЗавершение()»

&НаКлиенте

Процедура УстановитьКартинкиТоваровЗавершение(ПомещенныеФайлы, Дополнительно) Экспорт

 

Если ПомещенныеФайлы = Неопределено Тогда

Возврат;

КонецЕсли;

 

Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл

НаименованиеТовара = ПомещенныйФайл.СсылкаНаФайл.Файл.ИмяБезРасширения;

ИмяФайла = ПомещенныйФайл.СсылкаНаФайл.Имя;

АдресФайла = ПомещенныйФайл.Адрес;

ПоместитьФайлКартинки(НаименованиеТовара, ИмяФайла, АдресФайла);

КонецЦикла;

 

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

В этой процедуре в параметре ПомещенныеФайлы будет содержаться массив объектов ОписаниеПомещенногоФайла (адрес данных в хранилище и ссылка на помещенный файл).

По мере обхода элементов этого массива мы получаем по ссылке на каждый помещенный файл имя файла без расширения и имя файла с расширением, а также получаем адрес каждого помещенного файла картинки.

И передаем все эти параметры в серверную процедуру ПоместитьФайлКартинки(), в которой данные по этому адресу получаются из временного хранилища и записываются в виде двоичных данных в реквизит товара типа ХранилищеЗначения (листинг 6.24).

Листинг 6.24. Процедура «ПоместитьФайлКартинки()»

&НаСервереБезКонтекста

Процедура ПоместитьФайлКартинки(НаименованиеТовара, ИмяФайла, АдресФайла)

 

ТоварСсылка = Справочники.Товары.НайтиПоНаименованию(НаименованиеТовара, Истина);

 

Если ТоварСсылка <> Справочники.Товары.ПустаяСсылка() Тогда

 

Товар = ТоварСсылка.ПолучитьОбъект();

 

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);

Товар.ДанныеФайлаКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());

Товар.ИмяФайлаКартинки = ИмяФайла;

Товар.Записать();

 

УдалитьИзВременногоХранилища(АдресФайла);

КонецЕсли;

 

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

В этой процедуре в справочнике товаров находится товар с наименованием, совпадающим с именем помещенного файла без расширения (параметр НаименованиеТовара). Затем на основе двоичных данных, полученных из временного хранилища по адресу файла (параметр АдресФайла), создается объект ХранилищеЗначения и записывается в реквизит товара ДанныеФайлаКартинки, а в реквизите ИмяФайлаКартинки сохраняется имя (с расширением) помещенного файла (параметр ИмяФайла).

Если на сервер помещается большой объем данных, то имеет смысл вывести в окно состояния прогресс помещения файлов. Для этого в метод НачатьПомещениеФайловНаСервер() вторым параметром нужно передать описание оповещения о ходе выполнения (см. закомментированный фрагмент кода в листинге 6.22), указывающее на экспортную процедуру, которая будет вызвана несколько раз по мере помещения файлов (листинг 6.25).

Листинг 6.25. Процедура «УстановитьКартинкиТоваровХодВыполнения()»

&НаКлиенте

Процедура УстановитьКартинкиТоваровХодВыполнения(ПомещаемыйФайлы, Помещено, ОтказОтПомещенияФайла, ПомещеноВсего, ОтказОтПомещенияФайлов, Дополнительно) Экспорт

 

Состояние("Помещение файлов картинок товаров", ПомещеноВсего);

 

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

В параметре ПомещеноВсего содержится процент помещенной части всех файлов, который мы и выводим в окно Состояние (рис. 6.1).

Рис. 6.1. Информация о ходе помещения файлов на сервер

Назад: Передача и получение одного файла с сервера
Дальше: Получение нескольких файлов с сервера