Пример провайдера к внешнему хранилищу Google Drive

В данном пункте рассмотрен пример создания провайдера к внешнему хранилищу Google Drive для хранения бинарных данных файлов Docsvision.

Данный пример не является готовым решением для использования Google Drive в качестве внешнего хранилища, а только демонстрирует способ создания провайдера к нему.

Облачное хранилище Google Drive предоставляет возможность и API для работы с файлами из собственного приложения. Инструкция по работе с Google Drive API приведена на этой странице.

Для работы с Google Drive в данном примере используется предоставляемая реализация обертки для работы с Google Drive API в .NET (NuGet пакет).

Исходный код примера доступен по ссылке.

Пример содержит два проекта:
  1. GoogleDriveStorageProvider — проект компонента провайдера к файловому хранилищу с классами:

    1. GoogleDriveStorage — класс провайдера с реализацией интерфейсов IBinaryStorage, IExtensionInitialize, IStreamedBinaryStorage, IEnumerableBinaryStorage.

    2. GoogleDriveProviderPropertyControl — класс графического интерфейса настройки провайдера.

    3. GoogleDriveProxy — класс-посредник для работы с Google Drive API.

    4. ProviderSettings — вспомогательный класс с методами сериализации и десериализации настроек провайдера.

    5. LogWriter — вспомогательный класс журналирования работы провайдера.

    6. LocalizedDisplayNameAttribute — класс для получения локализованных ресурсов в атрибутах класса.

  2. AskToken — проект консольного приложения для получения токена для работы с Google Drive.

Требования примера

На компьютере программиста должны быть установлены:
  1. Microsoft Visual Studio 2015 или выше.

  2. Microsoft .NET Framework 4.6.1.

Последовательность работы с примером

  1. Распакуйте архив примера на локальный диск.

  2. Получите файл с конфигурацией клиента (credentials.json) по инструкции в шаге 1 на странице. Потребуется авторизоваться в Google.

  3. Загрузите файл credentials.json в папку GoogleDriveStorageProvider\AskToken\bin\Debug\ распакованного архива примера.

  4. Включите в Visual Studio настройку Allow Nuget to download missing package для автоматической загрузки необходимых пакетов библиотеки Google Drive API.

  5. Повторно подключите зависимости DocsVision.Platform.StorageServer и DocsVision.Platform.WinForms в проекте GoogleDriveStorageProvider. К проекту должны быть подключены компоненты, используемые на сервере Docsvision.

  6. Соберите проект GoogleDriveStorageProvider.

  7. Соберите и запустите проект AskToken. В процессе работы программы AskToken будет вызван код из класса GoogleDriveProxy (проект GoogleDriveStorageProvider):

    using (var stream =
                    new FileStream(credentialsFile, FileMode.Open, FileAccess.Read))
                {
                    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(stream).Secrets,
                        new string[] { DriveService.Scope.Drive },
                        "user",
                        CancellationToken.None,
                        new FileDataStore(tokenFolder, true)).Result;
    
                    logWriter.Write("Токен получен из папки: " + tokenFolder);
                }

    Данный код сформирует файл с токеном, который необходим для работы с API Google Drive (см. описание в шаге 3 данного примера). Для получения токена нужно разрешить приложению (название приложения указывается при выполнении п. 2) доступ к аккаунту Google.

    Токен будет сохранен в папку GoogleDriveStorageProvider\AskToken\bin\Debug\token.json\.

  8. Скопируйте на сервер Docsvision файлы из папки GoogleDriveStorageProvider\bin\Debug\:

    • GoogleDriveStorageProvider.dll,

    • ru\GoogleDriveStorageProvider.resources.dll,

    • Google.Apis.Drive.v3.dll,

    • Google.Apis.Auth.PlatformServices.dll,

    • Google.Apis.Auth.dll,

    • Google.Apis.PlatformServices.dll,

    • Google.Apis.Core.dll,

    • Google.Apis.dll,

    • Newtonsoft.Json.dll.

  9. Зарегистрируйте в GAC скопированные файлы.

  10. Скопируйте на сервер Docsvision папку AskToken\bin\Debug\token.json\ и файл AskToken\bin\Debug\credentials.json. Данные файлы потребуются для работы провайдера к Google Drive. Файл и папку нужно скопировать в каталог доступный для сервера Docsvision, но недоступный рядовым пользователям (из-за наличия конфиденциальных данных в файлах).

  11. Подключите новый тип хранилища к Docsvision.

    Проверяйте работу компонентов на тестовом сервере Docsvision.
    1. Откройте Консоль настройки Docsvision.

    2. Перейдите в раздел Настройки сервер  Базы данных. Выберите настраиваемую БД и нажмите кнопку Настройка., чтобы открыть окно Свойства и управление базой данных.

    3. Перейдите на вкладку Внешние хранилища.

    4. Добавьте новое хранилище. В окне настройки хранилища в поле Тип нужно выбрать вариант Добавить из сборки и выбрать файл GoogleDriveStorageProvider.dll из каталога GAC. В список типов хранилищ будет добавлено хранилище с названием "Хранилище в Google Drive".

    5. Настройте новое хранилище с типом "Хранилище в Google Drive", группу и правило помещения в хранилище следуя инструкции, приведенной в документации модуля Платформа.

      При настройке хранилища необходимо указать: путь к файлу credentials.json и папке token.json (загружены в п. 10), путь к файлу журнала работы провайдера.

      Пример настройки хранилища в Google Drive
      Рисунок 1. Пример настройки хранилища в Google Drive
      После перезапуска сервера Docsvision (будет выполнен после добавления хранилища) в Google Drive будут созданы две папки:
      • DV_PrimaryPart — представляет раздел для основных файлов.

      • DV_ArchivePart — представляет раздел для архивных файлов.

        Проверить работу провайдера можно настроив правило на помещение в хранилище файлов с расширением .pdf. При добавлении в карточку Docsvision файла с типом .pdf, соответствующий файл будет загружен в Google Drive.