понедельник, 13 марта 2017 г.

Загрузка файлов: выбор на клиенте, обработка на сервере

Загрузка файлов: выбор на клиенте, обработка на сервере

Приведенный ниже код иллюстрирует работу с файлом типа "xlsx". Работа ведется из управляемой формы:
  • пользователь выбирает файл;
  • файл помещается в временное хранилище, и становится доступен на сервере в виде двоичных данных;
  • производится запись двоичных данных в временный файл на сервере, с проверкой: если запись временного файла занимает более 30 секунд, пользователь получит уведомление о прерывании загрузки.
// Выбор загружаемого файла, заполнение служебного реквизита формы "АдресФайлаВВременномХранилище"
//
//Возвращаемое значение:
// Булево - Истина при успешном выборе файла
//
&НаКлиенте
Функция ПроизведенУспешныйВыборФайла()
    
    ЭтаФорма.АдресФайлаВВременномХранилище = "";
    
    #Если ВебКлиент Тогда
        
        Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
            УстановитьРасширениеРаботыСФайлами();
            ПодключитьРасширениеРаботыСФайлами();
        КонецЕсли;
        
        ПоместитьФайл(ЭтаФорма.АдресФайлаВВременномХранилище);
        
    #Иначе
        
        ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        
        ДиалогФыбораФайла.Фильтр = "Таблица(*.xlsx)|*.xlsx";
        ДиалогФыбораФайла.Заголовок = "Выберите файл";
        ДиалогФыбораФайла.ПредварительныйПросмотр = Ложь;
        ДиалогФыбораФайла.Расширение = "xlsx";
        ДиалогФыбораФайла.МножественныйВыбор = Ложь;
        
        Если ДиалогФыбораФайла.Выбрать() Тогда
            ФайлЗагрузки = ДиалогФыбораФайла.ПолноеИмяФайла;
        Иначе
            Возврат Ложь;
        КонецЕсли;
        
        ЭтаФорма.АдресФайлаВВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ДиалогФыбораФайла.ПолноеИмяФайла));
        
    #КонецЕсли
    
    Возврат НЕ ПустаяСтрока(ЭтаФорма.АдресФайлаВВременномХранилище); 
    
КонецФункции
        
Пример использования:
//...        
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    
    Если ПроизведенУспешныйВыборФайла() Тогда
        ВыполнитьЗагрузкуФайлаНаСервере(); 
    КонецЕсли; 
    
КонецПроцедуры

//...
&НаСервере
Процедура ВыполнитьЗагрузкуФайлаНаСервере()
    
    АдресВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    
    // Запись двоичных данных из вр. хранилища:
    ДвДанные = ПолучитьИзВременногоХранилища(ЭтаФорма.АдресФайлаВВременномХранилище);

    Если ЗаписьФайлаПроизошлаУспешно(ДвДанные, АдресВременногоФайла) Тогда // см. ниже "Проверка записи файла
        // обработка данных файла...    
    Иначе
        ЛОГ("загрузка прервана на сервере - файл """+ АдресВременногоФайла +""" не обнаружен...");
    КонецЕсли;     
    
КонецПроцедуры
//...

Оригинал: infostart