简体   繁体   中英

API Download File from BIM360 Doc Plans folder

I am trying to download file from Autodesk BIM360 Doc ( https://docs.b360.autodesk.com ) with the Forge API so the files can be then afterward archieved to our local storage.

I have managed to download any files from "Project Files" folder using the data management API https://forge.autodesk.com/en/docs/data/v2/reference/http/projects-project_id-versions-version_id-GET/ , with which i can get the storage id under data.relationships.storage.data.id .

however with the same API i cannot get the storage Id when querying files under "Plan" folder,

So is there any way with Forge API we can download a file from Plan folder? any help is appreciated.

The item listed in the Plan folder is a type of items:autodesk.bim360:Document , this type item won't have storage attribute shown in its responses of GET versions/:version_id and GET items/:item_id directly.

To obtain the physical file location, you should call GET versions/:version_id/relationships/refs instead, see here for the similar thread: Download a Document with Autodesk API

Update for copied item

While accessing the relationship data of version of the copied item via GET versions/:version_id/relationships/refs , you would see a data attribute telling the relationship between the copied item and the source item with my experience:

"data": [
    {
        "type": "versions",
        "id": "urn:adsk.wipprod:fs.file:vf.34Xvlw1jTcSQ_XkIVh07cg?version=2",
        "meta": {
            "refType": "derived",
            "fromId": "urn:adsk.wipprod:fs.file:vf.34Xvlw1jTcSQ_XkIVh07cg?version=2",
            "fromType": "versions",
            "toId": "urn:adsk.wipprod:fs.file:vf.y3L7YbfAQJWwumMgqjJUxg?version=1",
            "toType": "versions",
            "direction": "to",
            "extension": {
                "type": "derived:autodesk.bim360:CopyDocument",
                "version": "1.0",
                "schema": {
                    "href": "https://developer.api.autodesk.com/schema/v1/versions/derived:autodesk.bim360:CopyDocument-1.0"
                },
                "data": {}
            }
        }
    }
],  

Afterward, you have to access the version relationship dat of the fromId via calling GET versions/:version_id/relationships/refs .

In this case, it's {PROJ_ID}/versions/urn:adsk.wipprod:fs.file:vf.34Xvlw1jTcSQ_XkIVh07cg%3Fversion=2/relationships/refs , then you will see the storage attribute inside the response with my investigation.

Just in case anyone else run into the same issue, i post my code with which i finally managed to get the file storage information. However please feel free to suggest other approaches than iteration to the full relationship trees.

internal static ForgeFileInfo getItemVersion(string token, string projectID, string versionID)
    {
        ForgeFileInfo forgeFileInfo = new ForgeFileInfo();

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        versionApi.Configuration.AccessToken = token;
        var version = versionApi.GetVersion(projectID, versionID);
        string fileType = version.data.attributes.extension.type;
        switch (fileType) {
            case "versions:autodesk.bim360:File":
                //File from Project File library or is regual file
                forgeFileInfo.FileName = version.data.attributes.displayName;
                forgeFileInfo.FileLocation = version.data.relationships.storage.meta.link.href;
                forgeFileInfo.StorageId = version.data.relationships.storage.data.id;
                return forgeFileInfo;
            case "versions:autodesk.bim360:Document":
                //File from Plan Library
                var versionRelationship=versionApi.GetVersionRelationshipsRefs(projectID, versionID);

                // the GET Relationship has data node where we can get the related document
                var relationshipData = new DynamicDictionaryItems(versionRelationship.data);
                // let's start iterating the relationship DATA
                foreach (KeyValuePair<string, dynamic> relationshipItem in relationshipData)
                {
                    //Have to loop until we found "derived:autodesk.bim360:FileToDocument"
                    var relationType = relationshipItem.Value.meta.extension.type;
                    var relation = relationshipItem.Value.meta.direction;
                    if ("derived:autodesk.bim360:FileToDocument".Equals(relationType))
                    {
                        if ("to".Equals(relation))
                        {
                            //Go up stream
                            return getItemVersion(token, projectID, relationshipItem.Value.id);
                        }
                    }
                    else if ("derived:autodesk.bim360:CopyDocument".Equals(relationType))
                    {
                        if ("to".Equals(relation))
                        {
                            //Go up stream
                            return getItemVersion(token, projectID, relationshipItem.Value.id);
                        }
                        continue;
                    }               
                }
                break;
        }
        return forgeFileInfo;
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM