Загрузка файла в документ
Пример показывает, как загрузить файл и добавить его документу средствами клиентской библиотеки
Ascon.Polynom.Web.Api.Client. Проект — Samples.WebApi.UploadFileForDocument.
Требования
- .NET 8.
- Запущенный web-сервер ПОЛИНОМ:MDM с доступным хранилищем.
- Пакет
Ascon.Polynom.Web.Api.Clientиз локального фида (подключается автоматически).
Алгоритм
- Авторизоваться в web-API.
- Получить или создать справочник.
- Получить или создать группу документов.
- Получить или создать документ.
- Загрузить файл и добавить его документу, выйти из сессии.
Авторизация
Авторизация выполняется хелпером 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.