0

I am trying to download a file from A360 via the Autodesk Forge Data Management API. The documentation states that the JSON returned for an 'Items' or 'Versions' should have a section called 'included.relationships.storage.meta.link.href'.

Step 5: Find the versions of an item

If you only want the latest version, you can simply get the link from the response body of the previous step. In the above example, we can see the storage location of House Design.rvt in the included.relationships.storage.meta.link.href attribute (https://developer.api.autodesk.com/oss/v2/buckets/wip.dm.prod/objects/977d69b1-43e7-40fa-8ece-6ec4602892f3.rvt) which can be used to download the item.

However the JSON returned seems to have this section missing.

i.e. GET projects/:project_id/items/:item_id

Using Postman

https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw

Returns

{      "jsonapi":{  
      "version":"1.0"    },    "links":{  
      "self":{  
         "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw"
      }    },    "data":{  
      "type":"items",
      "id":"urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw",
      "attributes":{  
         "displayName":"Test.dwg",
         "createTime":"2015-01-07T12:54:52.0000000Z",
         "createUserId":"201007051504283",
         "lastModifiedTime":"2015-01-07T12:54:52.0000000Z",
         "lastModifiedUserId":"201007051504283",
         "extension":{  
            "type":"items:autodesk.core:File",
            "version":"1.0",
            "schema":{  
               "href":"https://developer.api.autodesk.com/schema/v1/versions/items:autodesk.core:File-1.0"
            },
            "data":{  

            }
         }
      },
      "links":{  
         "self":{  
            "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw"
         }
      },
      "relationships":{  
         "tip":{  
            "data":{  
               "type":"versions",
               "id":"urn:adsk.wipprod:fs.file:vf.ZrHUacBXSa2M1C_Xu_vHOw?version=1"
            },
            "links":{  
               "related":{  
                  "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw/tip"
               }
            }
         },
         "versions":{  
            "links":{  
               "related":{  
                  "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw/versions"
               }
            }
         },
         "parent":{  
            "data":{  
               "type":"folders",
               "id":"urn:adsk.wipprod:fs.folder:co.UDepmIWYTSSfbYGIUhngIA"
            },
            "links":{  
               "related":{  
                  "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw/parent"
               }
            }
         },
         "refs":{  
            "links":{  
               "self":{  
                  "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw/relationships/refs"
               },
               "related":{  
                  "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw/refs"
               }
            }
         },
         "links":{  
            "links":{  
               "self":{  
                  "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/items/urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw/relationships/links"
               }
            }
         }
      }    },    "included":[  
      {  
         "type":"versions",
         "id":"urn:adsk.wipprod:fs.file:vf.ZrHUacBXSa2M1C_Xu_vHOw?version=1",
         "attributes":{  
            "name":"Test.dwg",
            "displayName":"Test.dwg",
            "createTime":"2015-01-07T12:54:52.0000000Z",
            "createUserId":"201007051504283",
            "lastModifiedTime":"2015-01-07T12:54:52.0000000Z",
            "lastModifiedUserId":"201007051504283",
            "versionNumber":1,
            "mimeType":"application/vnd.autodesk.autocad.dwg",
            "storageSize":438112,
            "fileType":"dwg",
            "extension":{  
               "type":"versions:autodesk.core:File",
               "version":"1.0",
               "schema":{  
                  "href":"https://developer.api.autodesk.com/schema/v1/versions/versions:autodesk.core:File-1.0"
               },
               "data":{  

               }
            }
         },
         "links":{  
            "self":{  
               "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/versions/urn:adsk.wipprod:fs.file:vf.ZrHUacBXSa2M1C_Xu_vHOw%3Fversion=1"
            }
         },
         "relationships":{  
            "item":{  
               "data":{  
                  "type":"items",
                  "id":"urn:adsk.wipprod:dm.lineage:ZrHUacBXSa2M1C_Xu_vHOw"
               },
               "links":{  
                  "related":{  
                     "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/versions/urn:adsk.wipprod:fs.file:vf.ZrHUacBXSa2M1C_Xu_vHOw%3Fversion=1/item"
                  }
               }
            },
            "links":{  
               "links":{  
                  "self":{  
                     "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/versions/urn:adsk.wipprod:fs.file:vf.ZrHUacBXSa2M1C_Xu_vHOw%3Fversion=1/relationships/links"
                  }
               }
            },
            "refs":{  
               "links":{  
                  "self":{  
                     "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/versions/urn:adsk.wipprod:fs.file:vf.ZrHUacBXSa2M1C_Xu_vHOw%3Fversion=1/relationships/refs"
                  },
                  "related":{  
                     "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/versions/urn:adsk.wipprod:fs.file:vf.ZrHUacBXSa2M1C_Xu_vHOw%3Fversion=1/refs"
                  }
               }
            },
            "downloadFormats":{  
               "links":{  
                  "related":{  
                     "href":"https://developer.api.autodesk.com/data/v1/projects/a.YnVzaW5lc3M6ZXhjaXRlY2gxNyMyMDE1MDEwNjc2MzA0MDE/versions/urn:adsk.wipprod:fs.file:vf.ZrHUacBXSa2M1C_Xu_vHOw%3Fversion=1/downloadFormats"
                  }
               }
            },
            "derivatives":{  
               "data":{  
                  "type":"derivatives",
                  "id":"dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLlpySFVhY0JYU2EyTTFDX1h1X3ZIT3c_dmVyc2lvbj0x"
               },
               "meta":{  
                  "link":{  
                     "href":"https://developer.api.autodesk.com/modelderivative/v2/designdata/dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLlpySFVhY0JYU2EyTTFDX1h1X3ZIT3c_dmVyc2lvbj0x/manifest"
                  }
               }
            },
            "thumbnails":{  
               "data":{  
                  "type":"thumbnails",
                  "id":"dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLlpySFVhY0JYU2EyTTFDX1h1X3ZIT3c_dmVyc2lvbj0x"
               },
               "meta":{  
                  "link":{  
                     "href":"https://developer.api.autodesk.com/modelderivative/v2/designdata/dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLlpySFVhY0JYU2EyTTFDX1h1X3ZIT3c_dmVyc2lvbj0x/thumbnail"
                  }
               }
            }
         }
      }    ] }
BassetMan
  • 461
  • 6
  • 13
  • Having uploaded a new file, this appears to have the storage data available. All existing files, which have not been updated for many months have no storage data. Could this be a issue with legacy data? – BassetMan Feb 11 '17 at 16:09
  • that was a legacy migration, I'll double check the date for you. – Augusto Goncalves Feb 13 '17 at 13:55

1 Answers1

0

Yes you are correct, unfortunately old files uploaded to A360 do not expose a "data" field through the API. The development team is working to add this feature in the future but I cannot tell you when this will be available, sorry for the bad news.

What you need in order to download an item is first to know which version you want, then get the objectKey and bucketKey from

version.relationships.storage.data.id

Here is my client side code:

/////////////////////////////////////////////////////////////////
// Download object from version
//
/////////////////////////////////////////////////////////////////
download (version) {

  // retrieves bucketKey/objectKey from storage Id

  var objectId = this.parseObjectId(
    version.relationships.storage.data.id)

  var uri = `${this.apiUrl}/buckets/` +
    `${objectId.bucketKey}/objects/${objectId.objectKey}`

  var link = document.createElement('a')

  link.download = version.attributes.displayName
  link.href = uri
  link.click()
}

And the server side (node.js)

//////////////////////////////////////////////////////////////////////
// GET /buckets/:bucketKey/objects/:objectKey
// Download an item version based on { bucketKey, objectKey }
//
/////////////////////////////////////////////////////////////////////
router.get('/buckets/:bucketKey/objects/:objectKey', async (req, res) => {

  try {

    var bucketKey = req.params.bucketKey

    var objectKey = req.params.objectKey

    var forgeSvc = ServiceManager.getService(
      'ForgeSvc')

    var ossSvc = ServiceManager.getService(
      'OssSvc')

    var token = await forgeSvc.get3LeggedTokenMaster(
      req.session)

    var object = await ossSvc.getObject(
      token.access_token,
      bucketKey, objectKey)

    res.end(object)

  } catch(ex) {

    res.status(ex.status || 500)
    res.json(ex)
  }
})

You can check the full source code of the project there.

Hope that helps

Felipe
  • 4,325
  • 1
  • 14
  • 19
  • Thanks Philippe, I did manage to download a newly uploaded file with no issue. But initially was just trying to download the existing content, with no joy. – BassetMan Feb 13 '17 at 14:04
  • Yes, unfortunately I can't tell you when this will be possible... You can stay tuned with the latest Forge updates on our new blog by the way: https://forge.autodesk.com/blog – Felipe Feb 13 '17 at 15:41