.NET SDK を利用した ACC へのファイル アップロード

A person seated at a desk working on a laptop while viewing a 3D model on an external monitor, with various office items around including a coffee cup and headphones.
Working in the Autodesk office at 300 Mission St. in San Francisco, CA.

はじめに

このブログ記事では、APS .NET SDK を使用して ACC にファイルをアップロードする手順について説明します。

利用可能なライブラリは、NuGet ギャラリー |AutodeskPlatformServices.SDK

このブログでは、SDK Manager、Authentication、OSS、および Data Management を使用します。 

仕組み

Upload a File  チュートリアルで説明されている手順を実行する必要があります。

このサンプルでは、Step 1 と 2 が Hubs Browser チュートリアルでカバーされているため、3 から 8 の Step に焦点を当てます。

最初に対処する必要があるのは、SDK Manager、クライアント、およびアクセス トークン生成の構成です。

string client_id = Environment.GetEnvironmentVariable("client_id");
string client_secret = Environment.GetEnvironmentVariable("client_secret");
SDKManager sdkManager = SdkManagerBuilder
.Create() // Creates SDK Manager Builder itself.
.Build();
DataManagementClient _dmClient = new DataManagementClient(sdkManager);
AuthenticationClient _authClient = new AuthenticationClient(sdkManager);
OssClient _ossClient = new OssClient(sdkManager);
TwoLeggedToken twoLeggedToken = _authClient.GetTwoLeggedTokenAsync(client_id, client_secret, new List<Scopes>() { Scopes.DataRead, Scopes.DataWrite, Scopes.DataCreate }).GetAwaiter().GetResult();

次に、以下の Step 3 から開始できます。

3. Create a storage location の手順では、DataManagementClient を通じて Data Management ライブラリを使用する必要があります。

private static Storage CreateStorage(DataManagementClient _dmClient, TwoLeggedToken twoLeggedToken, string project_id, string file_name, string folder_id)
{
    StoragePayload payload = new StoragePayload()
    {
        Jsonapi = new ModifyFolderPayloadJsonapi()
        {
            _Version = VersionNumber._10
        },
        Data = new StoragePayloadData()
        {
            Type = Autodesk.DataManagement.Model.Type.Objects,
            Attributes = new StoragePayloadDataAttributes()
            {
                Name = file_name,
            },
            Relationships = new StoragePayloadDataRelationships()
            {
                Target = new ModifyFolderPayloadDataRelationshipsParent()
                {
                    Data = new ModifyFolderPayloadDataRelationshipsParentData()
                    {
                        Type = Autodesk.DataManagement.Model.Type.Folders,
                        Id = folder_id,
                    }
                }
            }
        }
    };
    Storage storage = _dmClient.CreateStorageAsync(project_id, storagePayload: payload, accessToken: twoLeggedToken.AccessToken).GetAwaiter().GetResult();
    return storage;
}

次の 3 つの Step は、SDK に用意された 1つのメソッドでまとめて処理されます。

4. Generate a signed S3 url 

5. Upload a file to the signed url 

6. Complete the upload 

これらの Step では、OssClient を通じて OSS ライブラリを使用する必要があります。

private static void ReadAndUploadFile(OssClient _ossClient, TwoLeggedToken twoLeggedToken, string file_path, string bucket_key, string object_key)
{
    using (FileStream fileStream = new FileStream(file_path, FileMode.Open, FileAccess.Read))
    {
        _ossClient.Upload(bucket_key, object_key, fileStream, accessToken: twoLeggedToken.AccessToken, CancellationToken.None).GetAwaiter().GetResult();
    }
}

次に、新しいアイテム(v1)を作成するか、既存のアイテムに新しいバージョンを追加するかです。

このサンプルでは、基本的に最初のオプションを実装しています。同じ名前の Item がすでに存在する場合は、409 ステータスの例外エラーがスローされるので、2つ目のオプションに移ることが出来ます。

3-legged トークンを使用する場合、 Search エンドポイント 利用することができます。

  1. Create the first version of the uploaded file の Step では、DataManagementClient を通じて Data Management ライブラリを使用する必要があります。
private static Item CreateNewItem(DataManagementClient _dmClient, TwoLeggedToken twoLeggedToken, string project_id, string file_name, string folder_id, Storage storage)
{
    ItemPayload itemPayload = new ItemPayload()
    {
        Jsonapi = new ModifyFolderPayloadJsonapi()
        {
            _Version = VersionNumber._10
        },
        Data = new ItemPayloadData()
        {
            Type = Autodesk.DataManagement.Model.Type.Items,
            Attributes = new ItemPayloadDataAttributes()
            {
                DisplayName = file_name,
                Extension = new ItemPayloadDataAttributesExtension()
                {
                    Type = Autodesk.DataManagement.Model.Type.ItemsautodeskBim360File,
                    _Version = VersionNumber._10
                }
            },
            Relationships = new ItemPayloadDataRelationships()
            {
                Tip = new FolderPayloadDataRelationshipsParent()
                {
                    Data = new FolderPayloadDataRelationshipsParentData()
                    {
                        Type = Autodesk.DataManagement.Model.Type.Versions,
                        Id = "1"
                    }
                },
                Parent = new FolderPayloadDataRelationshipsParent()
                {
                    Data = new FolderPayloadDataRelationshipsParentData()
                    {
                        Type = Autodesk.DataManagement.Model.Type.Folders,
                        Id = folder_id
                    }
                }
            }
        },
        Included = new List<ItemPayloadIncluded>()
{
new ItemPayloadIncluded()
{
Type = Autodesk.DataManagement.Model.Type.Versions,
Id = "1",
Attributes = new ItemPayloadIncludedAttributes()
{
Name = file_name,
Extension = new ItemPayloadDataAttributesExtension()
{
Type = Autodesk.DataManagement.Model.Type.VersionsautodeskBim360File,
_Version = VersionNumber._10
}
},
Relationships = new ItemPayloadIncludedRelationships()
{
Storage = new FolderPayloadDataRelationshipsParent()
{
Data = new FolderPayloadDataRelationshipsParentData()
{
Type = Autodesk.DataManagement.Model.Type.Objects,
Id = storage.Data.Id,
}
}
}
}
}
    };
    Item newItem = _dmClient.CreateItemAsync(project_id, itemPayload: itemPayload, accessToken: twoLeggedToken.AccessToken).GetAwaiter().GetResult();
    return newItem;
}

また、新しいバージョンを追加する必要がある場合は、Item Id を見つける必要があります。

これは、次の方法でおこなわれます。

private static string GetItemId(DataManagementClient _dmClient, TwoLeggedToken twoLeggedToken, string project_id, string folder_id, string file_name)
{
    List<string> filterExtensionType = new List<string>() { "items:autodesk.bim360:File" };
    FolderContents folderContents = _dmClient.GetFolderContentsAsync(project_id, folder_id, accessToken: twoLeggedToken.AccessToken, filterExtensionType: filterExtensionType).GetAwaiter().GetResult();
    List<FolderContentsData> matchingItems = folderContents.Data.Where(d => d.Attributes.DisplayName == file_name).ToList();
    int pageNumber = 0;
    while (matchingItems.Count > 0 & !string.IsNullOrEmpty(folderContents.Links.Next?.Href))
    {
        pageNumber++;
        folderContents = _dmClient.GetFolderContentsAsync(project_id, folder_id, accessToken: twoLeggedToken.AccessToken, filterExtensionType: filterExtensionType, pageNumber: pageNumber).GetAwaiter().GetResult();
        matchingItems = folderContents.Data.Where(d => d.Attributes.DisplayName == file_name).ToList();
    }
    return matchingItems.First().Id;
}

Item Idを使用して、新しいバージョンの作成に進むことができます。

8. Update the version of a file の手順では、Data Management ライブラリを使用する必要があります。_dmClient

private static void CreateNewVersion(DataManagementClient _dmClient, TwoLeggedToken twoLeggedToken, string project_id, string file_name, Storage storage, string item_id)
{
    VersionPayload versionPayload = new VersionPayload()
    {
        Jsonapi = new ModifyFolderPayloadJsonapi()
        {
            _Version = VersionNumber._10
        },
        Data = new VersionPayloadData()
        {
            Type = Autodesk.DataManagement.Model.Type.Versions,
            Attributes = new VersionPayloadDataAttributes()
            {
                Name = file_name,
                Extension = new RelationshipRefsPayloadDataMetaExtension()
                {
                    Type = Autodesk.DataManagement.Model.Type.VersionsautodeskBim360File,
                    _Version = VersionNumber._10
                }
            },
            Relationships = new VersionPayloadDataRelationships()
            {
                Item = new FolderPayloadDataRelationshipsParent()
                {
                    Data = new FolderPayloadDataRelationshipsParentData()
                    {
                        Type = Autodesk.DataManagement.Model.Type.Items,
                        Id = item_id
                    }
                },
                Storage = new FolderPayloadDataRelationshipsParent()
                {
                    Data = new FolderPayloadDataRelationshipsParentData()
                    {
                        Type = Autodesk.DataManagement.Model.Type.Objects,
                        Id = storage.Data.Id,
                    }
                }
            }
        }
    };
    Console.WriteLine(versionPayload.ToString());
    ModelVersion newVersion = _dmClient.CreateVersionAsync(project_id, versionPayload: versionPayload, accessToken: twoLeggedToken.AccessToken).GetAwaiter().GetResult();
}

完全なソースコードは次の GitHub リポジトリを参照してください。

ソース

※ 本記事は Uploading a file to ACC using the .NET SDK | Autodesk Platform Services から転写・意訳、補足を加えたものです。

By Toshiaki Isezaki

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading