Table of Contents

Загрузка файла в документ

Пример показывает, как загрузить файл и добавить его документу средствами клиентской библиотеки Ascon.Polynom.Web.Api.Client. Проект — Samples.WebApi.UploadFileForDocument.

Требования

  • .NET 8.
  • Запущенный web-сервер ПОЛИНОМ:MDM с доступным хранилищем.
  • Пакет Ascon.Polynom.Web.Api.Client из локального фида (подключается автоматически).

Алгоритм

  1. Авторизоваться в web-API.
  2. Получить или создать справочник.
  3. Получить или создать группу документов.
  4. Получить или создать документ.
  5. Загрузить файл и добавить его документу, выйти из сессии.

Авторизация

Авторизация выполняется хелпером PolynomClientSession поверх AuthorizationService. Подробно — в разделе Авторизация в C# через клиентскую библиотеку.

Реализация

Сценарий последовательно использует сервисы библиотеки: ReferenceApiClient, DocumentCatalogApiClient, DocumentGroupApiClient, DocumentApiClient и FileApiClient. Файл добавляется документу методом AddToDocument с моделью AddToDocumentRequest.

using Ascon.Polynom.Web.Api.Client.Enums;

using Samples.WebApi.Common.Services;

using var session = await PolynomClientSession.CreateAsync(cancellationToken);

// Наименования справочника, группы документов и документа, а также путь к файлу.
var referenceName = "Документы проекта";
var documentGroupName = "Чертежи";
var documentName = "Чертёж детали";
var filePath = "C:\\Docs\\drawing.pdf";

var referenceClient = session.Factory.CreateReferenceApiClient();
var references = await referenceClient.GetAll(cancellationToken);

var reference = (references ?? new()).FirstOrDefault(x => x.Name == referenceName)
    ?? await referenceClient.Create(new CreateReferenceRequest { Name = referenceName }, cancellationToken);

var documentCatalog = await session.Factory.CreateDocumentCatalogApiClient()
    .GetByReference(new IdentifierRequest
    {
        ObjectId = reference!.ObjectId,
        TypeId = IdentifiableObjectType.Reference
    }, cancellationToken);

var documentGroups = await session.Factory.CreateDocumentGroupApiClient()
    .GetByCatalog(new IdentifierRequest
    {
        ObjectId = documentCatalog!.ObjectId,
        TypeId = IdentifiableObjectType.DocumentCatalog
    }, cancellationToken);

var documentGroup = (documentGroups ?? new()).FirstOrDefault(x => x.Name == documentGroupName)
    ?? await session.Factory.CreateDocumentGroupApiClient().Create(new CreateDocumentGroupRequest
    {
        ParentGroup = new IdentifiableObject
        {
            ObjectId = documentCatalog.ObjectId,
            TypeId = IdentifiableObjectType.DocumentCatalog
        },
        Name = documentGroupName
    }, cancellationToken);

var documents = await session.Factory.CreateDocumentApiClient()
    .GetByDocumentGroup(new IdentifierRequest
    {
        ObjectId = documentGroup!.ObjectId,
        TypeId = IdentifiableObjectType.DocumentGroup
    }, cancellationToken);

var document = (documents ?? new()).FirstOrDefault(x => x.Name == documentName)
    ?? await session.Factory.CreateDocumentApiClient().Create(new CreateDocumentRequest
    {
        ParentGroup = new IdentifiableObject
        {
            ObjectId = documentGroup.ObjectId,
            TypeId = IdentifiableObjectType.DocumentGroup
        },
        Name = documentName
    }, cancellationToken);

string? temporaryFileName;
await using (FileStream fileStream = File.OpenRead(filePath))
{
    temporaryFileName = await session.Factory.CreateFileApiClient().Upload(fileStream, cancellationToken);
}

await session.Factory.CreateFileApiClient().AddToDocument(new AddToDocumentRequest
{
    FileName = Path.GetFileName(filePath),
    TemporaryFileName = temporaryFileName ?? string.Empty,
    CreationDate = File.GetCreationTime(filePath),
    ModificationDate = File.GetLastWriteTime(filePath),
    Document = new IdentifiableObject
    {
        ObjectId = document!.ObjectId,
        TypeId = IdentifiableObjectType.Document
    }
}, cancellationToken);

await session.SignOutAsync(cancellationToken);

Используемые методы библиотеки

Сервис Метод Назначение
ReferenceApiClient GetAll, Create(CreateReferenceRequest, ...) Справочники: список и создание
DocumentCatalogApiClient GetByReference(IdentifierRequest, ...) Каталог документов справочника
DocumentGroupApiClient GetByCatalog, Create(CreateDocumentGroupRequest, ...) Группы документов
DocumentApiClient GetByDocumentGroup, Create(CreateDocumentRequest, ...) Документы
FileApiClient Upload(Stream, ...), AddToDocument(AddToDocumentRequest, ...) Загрузка файла и добавление документу

Результат

Файл загружается на web-сервер и добавляется документу. Отсутствующие справочник, группа и документ создаются автоматически.

Возможные ошибки

  • Файл не найден — проверьте путь к загружаемому файлу.
  • Нет прав на создание — отсутствующие объекты не будут созданы без соответствующих прав.
  • Сессия истекла — библиотека обновит токен и повторит запрос; при неудаче требуется повторный вход.

Ссылки

Пример-приложение в составе SDK: SDK/Web/Samples/Server/Samples.WebApi.UploadFileForDocument.