Каталог решений - Загрузка, скачивание, удаление файлов с помощью НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера()

Загрузка, скачивание, удаление файлов с помощью НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера()

Загрузка, скачивание, удаление файлов с помощью НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера()

В наличии

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

Категория:

Описание

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

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

Создан регистр сведений "РегистрФайлов":

Измерения:

  • Наименование (строка 50)

Реквизиты:

  • Файл (ХранилищеЗначения)
  • ИмяФайла (Строка 255)
  • РазмерФайла (Число 8,0 Неотрицательное)

У регистра создана форма записи на которую добавлен реквизит АдресФайла (Строка 0).

Добавлены 3 команды — Загрузить файл, Скачать файл и Удалить файл.

Прописан следующий код:

    #Область ОбработчикиСобытийФормы
    
    &НаСервере
    Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    	Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда
    		ТекущийОбъект.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресФайла));
    	ИначеЕсли Не ЗначениеЗаполнено(ТекущийОбъект.ИмяФайла) Тогда
    		ТекущийОбъект.Файл = Новый ХранилищеЗначения(Неопределено);
    	КонецЕсли;
    
    КонецПроцедуры
    
    #КонецОбласти
    
    #Область ОбработчикиКомандФормы
    
    &НаКлиенте
    Процедура ЗагрузитьФайл(Команда)
    
    	ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
    	ПараметрыДиалога.МножественныйВыбор = Ложь;
    	ПараметрыДиалога.Заголовок = НСтр("ru = 'Выберите файл'; en = 'Select file'");
       	ПараметрыДиалога.Фильтр = НСтр("ru = 'Текстовый файл'; en = 'Text file'") + " (*.txt)|*.txt|";
    	
        ЗавершениеОбратныйВызов = Новый ОписаниеОповещения("ЗавершениеОбратныйВызов", ЭтотОбъект);
        ПрогрессОбратныйВызов = Новый ОписаниеОповещения("ПрогрессОбратныйВызов", ЭтотОбъект);
        ПередНачаломОбратныйВызов = Новый ОписаниеОповещения("ПередНачаломОбратныйВызов", ЭтотОбъект);
        НачатьПомещениеФайлаНаСервер(ЗавершениеОбратныйВызов, ПрогрессОбратныйВызов, ПередНачаломОбратныйВызов,, ПараметрыДиалога, ЭтаФорма.УникальныйИдентификатор);
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура СкачатьФайл(Команда)
    
    	Если Не ЗначениеЗаполнено(Запись.ИмяФайла) Тогда
    		Возврат;
    	КонецЕсли;
    	
    	АдресФайлаДляСкачивания = АдресФайла;
    	
    	Если Не ЭтоАдресВременногоХранилища(АдресФайлаДляСкачивания) Тогда
    		АдресФайлаДляСкачивания = ПолучитьАдресФайлаДляСкачивания();
    	КонецЕсли;
    	
    	Если ЭтоАдресВременногоХранилища(АдресФайлаДляСкачивания) Тогда
    		ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов;
    		ПараметрыДиалога.Заголовок = НСтр("ru = 'Выберите путь для сохранения файла'; en = 'Select the path to save the file'");
    		
    		НачатьПолучениеФайлаССервера(АдресФайлаДляСкачивания, Запись.ИмяФайла, ПараметрыДиалога);
    	КонецЕсли;
    
    КонецПроцедуры
    
    &НаСервере
    Функция ПолучитьАдресФайлаДляСкачивания()
    
    	МенеджерЗаписи = РегистрыСведений.РегистрФайлов.СоздатьМенеджерЗаписи();
    	ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Запись.ИсходныйКлючЗаписи);
    	МенеджерЗаписи.Прочитать();
    	
    	АдресДляСкачивания = Неопределено;
    	
    	Если МенеджерЗаписи.Выбран() Тогда
    		ДанныеФайла = МенеджерЗаписи.Файл.Получить();
    		Если ДанныеФайла <> Неопределено Тогда
    			АдресДляСкачивания = ПоместитьВоВременноеХранилище(ДанныеФайла);
    		КонецЕсли;
    	КонецЕсли;
    	
    	Возврат АдресДляСкачивания;
    
    КонецФункции
    
    &НаКлиенте
    Процедура УдалитьФайл(Команда)
    
    	Если Не ЗначениеЗаполнено(Запись.ИмяФайла) Тогда
    		Возврат;
    	КонецЕсли; 
    	
    	ТекстВопроса = НСтр("ru = 'Удалить файл?'; en = 'Delete file?'");
    	ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьФайлЗавершение", ЭтотОбъект);
    	ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60);
    
    КонецПроцедуры
    
    #КонецОбласти
    
    #Область СлужебныеПроцедурыИФункции
    
    &НаКлиенте
    Процедура ЗавершениеОбратныйВызов(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
    
    	Если ОписаниеПомещенногоФайла = Неопределено Тогда
    		Возврат;
    	КонецЕсли;
    	
    	Если Не ФайлКорректный(ОписаниеПомещенногоФайла.Адрес) Тогда
    		ТекстСообщения = НСтр("ru = 'Файл пустой'; en = 'File is empty'");
    		
    		Сообщение = Новый СообщениеПользователю;
    		Сообщение.Текст = ТекстСообщения;
    		Сообщение.Сообщить(); 
    		
    		// ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
    		Возврат;
    	КонецЕсли;
    	
    	Запись.ИмяФайла = ОписаниеПомещенногоФайла.СсылкаНаФайл.Имя;
    	Запись.РазмерФайла = ОписаниеПомещенногоФайла.СсылкаНаФайл.Размер();
    	АдресФайла = ОписаниеПомещенногоФайла.Адрес;
    	
    	Модифицированность = Истина;
    
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Функция ФайлКорректный(АдресФайлаВоВременномХранилище)
    
    	ПутьКФайлу = ПолучитьИмяВременногоФайла("txt");
    	
    	ДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
    	Если ТипЗнч(ДанныеИзХранилища) = Тип("ДвоичныеДанные") Тогда
    		ДанныеИзХранилища.Записать(ПутьКФайлу);
    	КонецЕсли;
    	
    	// Проверка на то что файл корректный
    	ЧтениеТекста = Новый ЧтениеТекста;
    	ЧтениеТекста.Открыть(ПутьКФайлу);
    	Текст = ЧтениеТекста.Прочитать();
    	
    	Возврат ЗначениеЗаполнено(Текст);
    	
    КонецФункции
    
    &НаКлиенте
    Процедура ПрогрессОбратныйВызов(ПомещаемыйФайл, Помещено, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
    
    	ТекстСообщения = СтрШаблон(НСтр("ru = 'Загрузка файла %1'; en = 'Uploading file %1'"), ПомещаемыйФайл.Имя);
    	РазмерФайла = СтрШаблон(Нстр("ru = 'Размер файла %1 байт'; en = 'File size %1 bytes'"), ПомещаемыйФайл.Размер());
    	
    	Состояние(ТекстСообщения, Помещено, РазмерФайла, БиблиотекаКартинок.Документ);
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПередНачаломОбратныйВызов(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
    
    	МегабайтВБайтах = 1000000;
    	Если ПомещаемыйФайл.Размер() > МегабайтВБайтах Тогда
    		ОтказОтПомещенияФайла = Истина;
    		ТекстСообщения = СтрШаблон(НСтр("ru = 'Отказ. Загружаемый файл «%1» имеет размер более 1 мегабайта';
    		|en = 'Failure. The uploaded file «%1» is larger than 1 megabyte'"), ПомещаемыйФайл.Имя);
    		
    		Сообщение = Новый СообщениеПользователю;
    		Сообщение.Текст = ТекстСообщения;
    		Сообщение.Сообщить();
    		ОтказОтПомещенияФайла = Истина;
    		
    		//ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,,,, ОтказОтПомещенияФайла);
    	Иначе
    		ПоказатьОповещениеПользователя(НСтр("ru = 'Загрузка файла'; en = 'Uploading file'"),, ПомещаемыйФайл.Имя);
    	КонецЕсли;  
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура УдалитьФайлЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
    
    	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
    		АдресФайла = "";
    		Запись.ИмяФайла = "";
    		Запись.РазмерФайла = 0;
    		Модифицированность = Истина;
    	КонецЕсли;
    
    КонецПроцедуры
    
    #КонецОбласти
    
    
    has been added to your cart:
    Оформление заказа