7.6
файлы
Технические вопросы
7.x

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

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

Нравится

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

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

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

1) Начальный элемент
2) Получение данных о файле элементом "Чтение данных"
3) "Исключающее ИЛИ" с двумя условными потоками (если файлов для выгрузки больше нет, то конец процесса), иначе идем дальше.
4) Элемент "Задание-сценарий" с приблизительным кодом:
[csharp]
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";
}
[/csharp]

(источник)

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

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

Все оказалось даже проще.
Может кому-то пригодится
Для работоспособности в using нужно добавить System.IO
[csharp]
//получаем stream из Entity
MemoryStream ms=documentFile.GetStreamValue("Data");
//записываем его в файл
ms.SaveToFile(dir+name);
[/csharp]

ниже приведен полный код метода, используемого в сервисе
[csharp]
[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("Name");
MemoryStream ms=documentFile.GetStreamValue("Data");
try
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
ms.SaveToFile(dir+name);
}
catch (Exception e)
{

}
}

} }
[/csharp]

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

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

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

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

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

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

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

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

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

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

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

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