Добрый день!
Как можно выгрузить все файлы из детали файлы и ссылки в сетевую папку на диск?
Сделать это нужно программно.
Нравится
Добрый день, Александр!
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"