Выгрузка файлов из детали файлы и ссылки

Добрый день!
Как можно выгрузить все файлы из детали файлы и ссылки в сетевую папку на диск?
Сделать это нужно программно.

Нравится

6 комментариев

Добрый день, Александр!

bpmonline не предполагает таких операций. Тем не менее данную задачу можно попробовать реализовать через бизнес процесс. Вам необходимо перебрать все записи в соответствующей таблице (объекте). Для каждого раздела объект "Файлы и ссылки" свой (как и таблица в базе данных).

1) Начальный элемент
2) Получение данных о файле элементом "Чтение данных"
3) "Исключающее ИЛИ" с двумя условными потоками (если файлов для выгрузки больше нет, то конец процесса), иначе идем дальше.
4) Элемент "Задание-сценарий" с приблизительным кодом:

   public static string SaveDecompressFile(string FileName, SqlBytes CompressedFile)
    {
        if (CompressedFile.IsNull)
        return "Error";
 
        DeflateStream decompress = new DeflateStream(CompressedFile.Stream, CompressionMode.Decompress, true);
 
        try
        {
 
            FileStream file = File.Create(FileName);
 
            int sourcebyte = decompress.ReadByte();
            while (sourcebyte != -1)
            {
                file.WriteByte((byte)sourcebyte);
                sourcebyte = decompress.ReadByte();
            }
 
            file.Close();
        }
 
        catch (Exception)
        {
            return "Error";
        }
 
        finally
        {
            decompress.Close();
            decompress = null;
        }    
 
        return "OK";
    }

(источник)

Далее возвращаемся на элемент "Чтение данных".

В таком бизнес процессе необходимо будет увеличить максимальное число повторений (настраивается в свойствах процесса).

Все оказалось даже проще.
Может кому-то пригодится
Для работоспособности в using нужно добавить System.IO

//получаем stream из Entity 
MemoryStream ms=documentFile.GetStreamValue("Data");
//записываем его в файл
ms.SaveToFile(dir+name);  

ниже приведен полный код метода, используемого в сервисе

 [OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
    RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public void fileUnloadling(
	string documentId, //Id докумена
	string documentNumber
	)
{
	if (System.Diagnostics.Debugger.IsAttached)
	{
	    System.Diagnostics.Debugger.Break();
	}
	var UserConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
	var dir=Terrasoft.Core.Configuration.SysSettings.GetValue(UserConnection, "SxFilePathForUnloading")+documentNumber+"\\";
	EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("DocumentFile");
    EntitySchemaQuery esq = new EntitySchemaQuery(schema);
    esq.AddAllSchemaColumns();
    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Document", documentId));
    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Type", "529BC2F8-0EE0-DF11-971B-001D60E938C6")); //тип файл
 
    EntityCollection documentFileEntities = esq.GetEntityCollection(UserConnection);
    foreach (Entity documentFile in documentFileEntities  )
    {
        var name=documentFile.GetTypedColumnValue<string>("Name");
		MemoryStream ms=documentFile.GetStreamValue("Data");
        try
		{
			if (!Directory.Exists(dir))
                    {
                        Directory.CreateDirectory(dir);
                    }
			ms.SaveToFile(dir+name);  
		}
		catch (Exception e) 
		{
 
		}
    }
 
}    }

Пащенко Александр Сергеевич

а как мы определяем из детали какого объекта файлы и ссылки и какой именно записи это объекта забираем файлы?

Сафронов Иван Александрович,

В моем случае не нужно было универсальное решение для всех объектов. Как вариант, можете в параметрах прокидывать название объекта или родительской схемы и идентификатор записи. 

Какая у Вас задача?

Пащенко Александр Сергеевич,

После завершения активности хотелось бы выгружать все приложенные файлы на детали Файлы и ссылки в отдельную папку в хранилище.

Сафронов Иван Александрович,

Тогда можете в БП отловить сигналом завершение активности, а дальше скриптом выгружать из ActivityFile.

Учтите, что в детали еще могут быть ссылки. Нужно в запрос добавить фильтр по типу

Схемы файлов обычно называются по шаблону [название раздела] + "File"

Показать все комментарии