はじめに
このブログ記事では、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つのメソッドでまとめて処理されます。
5. Upload a file to the signed url
これらの 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 エンドポイント利用することができます。
7. 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
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。