ADN Open CIS
Сообщество программистов Autodesk в СНГ

28/02/2020

Хитрый способ перемещения файлов между хранилищами Forge

В экосистеме Forge существуют разные сервисы для хранения данных: Object Storage Service (OSS) для данных, специфичных для приложения, BIM 360 Docs, Fusion Team для пользовательских данных.

Способы копирования данных между хранилищами существуют, но они ограничены:

- в пределах одного bucket-а в OSS можно копировать объекты с помощью метода API: https://forge.autodesk.com/en/docs/data/v2/reference/http/buckets-:bucketKey-objects-:objectName-copyto-:newObjectName-PUT/ 

- в пределах одного проекта в BIM 360 с помощью метода API https://forge.autodesk.com/en/docs/data/v2/reference/http/projects-project_id-items-POST/ (нужно использовать параметр copyFrom)

Что насчёт более общего решения?

Вы можете использовать различные API, предлагаемые Forge для того, чтобы загрузить файл из сервиса хранилища к себе на сервер и затем загрузить их в другое хранилище. Если Ваш сервер очень быстрый и не имеет ограничений по соединениям, то можете дальше не читать и закрыть эту статью.

Подход, предлагаемый в этой статье, основан на использовании сервиса Design Automation API также имеет некоторые ограничения. Использование этого подхода в принципе - самый быстрый из возможных способов перемещения файлов между хранилищами Forge.

Так как Design Automation API для AutoCAD (DA4A) самый дешёвый из сервисов Design Automation (см цены), воспользуемся именно им. Всё, что нам нужно - это Activity, принимающая параметрами "source" - расположение исходного файла и "target" - назначение. 
Тем не менее, DA4A нужно что-то, что он может запустить, поэтому я создал пустое консольное приложение .NET Console App (используя .NET Framework), которое ничего не делает при запуске, упаковал его в AppBundle и загрузил на сервер.

zip-файл доступен здесь: https://github.com/adamenagy/CopyBetweenFolders/blob/master/EmptyExe.bundle.zip

Я назвал свой AppBundle "EmptyExe" и создал Activity со следующим свойствами:

Код - JavaScript: [Выделить]
  1. {
  2.   "commandLine": [
  3.     "$(appbundles[EmptyExe].path)\\EmptyExe.bundle\\Contents\\empty.exe"
  4.   ],
  5.   "parameters": {
  6.     "source": {
  7.       "verb": "get",
  8.       "description": "",
  9.       "localName": "file.blob"
  10.     },
  11.     "target": {
  12.       "verb": "put",
  13.       "description": "",
  14.       "localName": "file.blob"
  15.     }
  16.   },
  17.   "id": "<my client id>.CopyBetweenBuckets+prod",
  18.   "engine": "Autodesk.AutoCAD+22",
  19.   "appbundles": [
  20.     "<my client id>.EmptyExe+prod"
  21.   ],
  22.   "description": "CopyBetweenBuckets",
  23.   "version": 1
  24. }

Теперь я могу передавать URL исходного файла и URL требуемого расположения в WorkItem, чтобы переносить файлы с помощью Design Automation:

Код - JavaScript: [Выделить]
  1. {
  2.   "source": {
  3.     "verb": "get",
  4.     "localName": "file.blob",
  5.     "url": "https://developer.api.autodesk.com/oss/v2/buckets/adam_poc/objects/Chain.sat",
  6.     "headers": {
  7.       "Authorization": "Bearer <access token>",
  8.       "Content-type": "application/octet-stream"
  9.     }
  10.   },
  11.   "target": {
  12.     "verb": "put",
  13.     "localName": "file.blob",
  14.     "url": "https://developer.api.autodesk.com/oss/v2/buckets/adam_poc2/objects/Chain.sat",
  15.     "headers": {
  16.       "Authorization": "Bearer <access token>",
  17.       "Content-type": "application/octet-stream"
  18.     }
  19.   }
  20. }

Часть отчёта о запуске WorkItem-а, показывающая как загружается исходный файл, запускаетсяempty.exe, и загружается в новое расположение:

Код - HTML: [Выделить]
  1. [02/18/2020 17:45:49] Starting work item d1002c87d7c743fbb3345995fd9db6f6
  2. [02/18/2020 17:45:49] Start download phase.
  3. [02/18/2020 17:45:49] Start downloading file https://developer.api.autodesk.com/oss/v2/buckets/adam_poc/objects/Chain.sat.
  4. [02/18/2020 17:45:49] Start preparing AppPackage EmptyExe.
  5. [02/18/2020 17:45:49] Download bits and install app to local cache.
  6. [02/18/2020 17:45:49] End downloading file https://developer.api.autodesk.com/oss/v2/buckets/adam_poc/objects/Chain.sat. 1074980 bytes have been written to T:\Aces\Jobs\d1002c87d7c743fbb3345995fd9db6f6\file.blob.
  7. [02/18/2020 17:45:49] End download phase.
  8. [02/18/2020 17:45:49] Start preparing script and command line parameters.
  9. [02/18/2020 17:45:49] Command line: []
  10. [02/18/2020 17:45:49] Identified standalone application at T:\Aces\AcesRoot\22.0\coreEngine\Exe\HostApp.exe.
  11. [02/18/2020 17:45:49] End preparing script and command line parameters.
  12. [02/18/2020 17:45:49] Start script phase.
  13. [02/18/2020 17:45:49] ### Command line arguments: /isolate HKEY_CURRENT_USER\SOFTWARE\AppDataLow\Software\Autodesk\CoreUser\WorkItem_d1002c87d7c743fbb3345995fd9db6f6 "T:\Aces\Jobs\d1002c87d7c743fbb3345995fd9db6f6\userdata" /exe "T:\Aces\AcesRoot\22.0\coreEngine\Exe\HostApp.exe" .
  14. [02/18/2020 17:45:49] Start application HostApp.exe standard output dump.
  15. [02/18/2020 17:45:50] End application HostApp.exe standard output dump.
  16. [02/18/2020 17:45:50] End script phase.
  17. [02/18/2020 17:45:50] Start upload phase.
  18. [02/18/2020 17:45:50] Uploading T:\Aces\Jobs\d1002c87d7c743fbb3345995fd9db6f6\file.blob to https://developer.api.autodesk.com/oss/v2/buckets/adam_poc2/objects/Chain2.sat.
  19. [02/18/2020 17:45:51] End upload phase.
  20. [02/18/2020 17:45:51] Job finished with result Succeeded

Если Вы хотите перемещать файлы в BIM 360, но предпочитаете использовать существующие решения, можете посмотреть Cloudsferhttps://www.cloudsfer.com/supported-systems/bim-360/

Источник: https://forge.autodesk.com/blog/move-files-around-forge

Автор перевода: Александр Игнатович
Опубликовано 28.02.2020
Отредактировано 28.02.2020 в 17:23:16